可选功能的设计模式?
-
23-08-2019 - |
题
我有一个派生子类继承的基本类,它具有在所有派生类中应该相同的基本函数:
class Basic {
public:
Run() {
int input = something->getsomething();
switch(input)
{
/* Basic functionality */
case 1:
doA();
break;
case 2:
doB();
break;
case 5:
Foo();
break;
}
}
};
现在,基于派生类,我想向开关“添加”更多 case 语句。我在这里有什么选择?我可以声明虚函数并仅在将要使用它们的派生类中定义它们:
class Basic {
protected:
virtual void DoSomethingElse();
public:
Run() {
int input = something->getsomething();
switch(input)
{
/* Basic functionality */
...
case 6:
DoSomethingElse();
}
}
};
class Derived : public Basic {
protected:
void DoSomethingElse() { ... }
}
但这意味着当更改任何派生类中的函数时,我必须编辑我的基类以反映这些更改。
有没有专门针对此类问题的设计模式?我购买了一些关于设计模式的书籍,但我正在“按需要”学习它们,所以我不知道是否有我正在寻找的这种模式。
解决方案
您可能会发现有用的noreferrer">责任模式链阅读模板方法模式
其他提示
我想你需要的模式是链责任或也许策略结合动态调用表...
处理这个问题的正常方法是使用工厂。概要:
- 创建提供功能的相关类的层次结构。
- 创建一个工厂类,该工厂类接受输入并根据输入创建正确类型的类的实例
现在增加奖励积分:
- 创建一个在工厂中注册类的方案 - 您需要指定输入和类的类型来处理它
现在,当需要新输入时,您只需派生一个新类并将其注册到工厂即可。对 switch 语句的需要消失了。
如果您选择值只是小的整数,我会通过查找表代替case语句。 (该案件的行动将每个需要被编码为一个功能,所以你可以把函数指针表中的)。然后,继承类可以直接添加条目表。 (我猜的表必须是一个实例属性,它不能是静态的)。
科林
但是,当改变,这将意味着 在任何派生类的功能,我 不得不修改我的基类 反映这些变化。
为什么会变成这样是真的吗?
我照亮您的评论的 - 那么,如果你选择这种方法,你就会有这些问题。其他人张贴另外的方案的答案 - 我会检查这些了,看他们是否帮助你
А简单的解决方案:
class Basic {
public:
void Run() {
const int input = ...
if (!(BaseProcess(input) || Process(input))) ...
}
vitual bool Process(int input) { return false; }
bool BaseProcess(int input) {
switch(input) {
...
default: return false;
}
return true;
}
...
...然后实现子类的附加箱子处理()。 如果需要支持多于2个电平(即子子类中添加更多的情况下),那么就需要一个动态调度表。
不隶属于 StackOverflow