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;
}
输出结果:
参考资料