关于可能的设计模式的问题

时间:2010-06-09 09:15:07

标签: c++ design-patterns

我脑子里有这样的设计....我的目标是重复使用包含一些功能的程序,而不使用某些功能。 文献中称之为什么? 更多信息:有事件..事件导致调用function1()或function2()...

功能具有在事件发生时调用的功能。 特征可能会影响事件中调用的函数。 功能可能会影响对多个事件执行的操作。

所以它看起来可能是观察者模式+有关系...

class feature1
{
void feature1functionx();
void feature1functiony();
}

class feature2
{
void feature2functionw();
void feature2functionz();

}

class program: feature1, feature2
{
 vector<string> data;
void function1()
{
 feature2functionw();
}
void function2()
{
 feature1functiony();
 feature2functionz();
}
void execute()
{
  function1();
  function2();
}

}

4 个答案:

答案 0 :(得分:7)

继承模拟IS-A关系。

如果你想重用这些函数,那么使用HAS-A关系似乎很自然:那就是组合。

class program
{
public:
  void function1()
  {
    m2.feature2functionw();
  }
  void function2()
  {
    m1.feature1functiony();
    m2.feature2functionz();
  }
  void execute()
  {
    this->function1();
    this->function2();
  }
private:
  feature1 m1;
  feature2 m2;
};

我知道私人继承有时被认为是一种捷径,但它并没有带来任何东西,所以更喜欢构图,因为它不会给你带来太大的影响。

编辑:添加了方法的定义,因为它显然不是那么清楚。

答案 1 :(得分:0)

这个想法对我来说似乎很奇怪和复杂。这是类层次结构中的细化和替换。

具体来说,我会寻找这样的东西:

class feature1
{
  virtual void function1();
  virtual void function2();
  void execute() {
    function1();
    function2();
  }

}

class feature2:public feature1 //this is your program class
{
  virtual void function1() 
  {
     feature1::function1() //call previous functionality to refine
     //do feature2 stuff here
  }

  virtual void function2()
  {
     //don't call base class to replace
     //do feature2 stuff here
  }
}

现在feature2.Execute()做你想要的。

答案 2 :(得分:0)

您发布的代码让我想起了所谓的“模板方法”模式。理论上,这种模式看起来像这样:

class Base
{
public:
    void execute()
    {
        function1();
        function2();
    }
private:
    virtual void function1();
    virtual void function2();
};

然后在某个班级:

class Derived1 : public Base
{
    void function1()
    {
        //implementation here...
    }
};
然后你打电话给

b->execute(); //b is of type Base* and points to an object of type Derived1

并完成你的工作。

不确定这在你的情况下是如何工作的,可能根本不存在,但至少这是一个与你描述的模式非常相似的模式的例子。

答案 3 :(得分:0)

它几乎听起来像一个接口类,但听起来你在这些基类中实现了很多代码而不是纯粹抽象,这是在C ++中创建接口的常用方法。我想如果你确定基类永远不会共享任何名称等,这可能会有效。我不知道它们是否也可以被描述为这个问题中描述的mixin类:A use for multiple inheritance?