行为模式:Strategy 策略模式
目录

策略模式:定义了算法族,分别封装起来,让他们之间可以相互替换。 此模式让算法的变化独立于使用算法的客户。

参与者:

  • Strategy 策略类:定义算法使用到的接口。
  • ConcreteStrategy 具体策略:实现Stragegy的接口。
  • Context 上下文:维护一个策略对象,使用策略对象实现算法流程。
Context {
public:
Context(Strategy *s): {this->s = s;}

void method() {
s.fun1();
if (s.fun2On()){
s.fun2();
}
}

private:
Strategy *s;
};

策略模式并不是通过is-a的方法让Context继承Strategy的接口并实现, 而是通过has-a的方法,把Strategy接口委托(delegate)给Context。 再把实现具体策略的ConcreteStrategy对象传给Context,去调用那些公共接口。 这体现了设计模式的三个设计原则:

  1. 封装变化。找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 这个模式中变化的是Strategy接口具体的实现,不变的是Context算法的流程。
  2. 多用组合,少用继承has-ais-a更好。
  3. 针对接口编程,而不是针对实现编程。 “针对接口编程”的真正意思是“针对超类型(supertype)编程”。 在Java里,超类型就是抽象类或者接口类。在C++里,超类型就是含有纯虚函数的抽象基类。

另一种实现策略模式的方法是通过类初始化时传入函数指针,达到调用公共接口的目的:

typedef void (*TMFUNC)();
typedef int (*TMFUNCON)();

Context {
public
ConCreteClass(TMFUNC _fun1, TMFUNCON _fun2ON, TMFUNCON _fun2):
fun1(_fun1), fun2ON(_fun2ON), fun2(_fun2)
void method() {
fun1();
if (fun2On()){
fun2();
}
}

private:
TMFUNC fun1;
TMFUNCON fun2ON;
TMFUNC fun2;
};

发表评论