Strategy策略模式
作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
UML图:
代码实现
#include <iostream>
using namespace std;class Strategy {
public:~Strategy() {}virtual void AlgrithmInterface() = 0;
protected:Strategy() {}
};class ConcreteStrategyA : public Strategy {
public:ConcreteStrategyA() {}~ConcreteStrategyA() {}virtual void AlgrithmInterface() { cout << "ConcreteStrategyA::AlgrithmInterface" << endl; }
};class ConcreteStrategyB : public Strategy {
public:ConcreteStrategyB() {}~ConcreteStrategyB() {}virtual void AlgrithmInterface() { cout << "ConcreteStrategyB::AlgrithmInterface" << endl; }
};/*这个类是Strategy模式的关键,也是Strategy模式和Template模式的根本区别所在。*Strategy通过“组合”(委托)方式实现算法(实现)的异构,而Template模式则采取的是继承的方式这两个模式的区别也是继承和组合两种实现接口重用的方式的区别
*/
class Context {
public:Context(Strategy* strategy) { this->_strategy = strategy; }~Context() { delete this->_strategy; }void DoAction() { this->_strategy->AlgrithmInterface(); }
private:Strategy* _strategy;
};int main()
{/*Strategy模式和Template模式实际是实现一个抽象接口的两种方式:继承和组合之间的区别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体子类中。组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。这两种方式各有优缺点*/Strategy* pStr = new ConcreteStrategyA(); //策略A与B可替换Context* pcon = new Context(pStr);pcon->DoAction();pStr = new ConcreteStrategyB();pcon = new Context(pStr);pcon->DoAction();return 0;
}
输出结果:
参考资料
1. C++设计模式-Strategy策略模式