小话设计模式四:策略模式
策略模式定义:
定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式解析:
策略模式是处理算法的不同变体的一种行为模式,通过在抽象策略中定义算法接口或封装算法标识,实现该抽象策略的具体子类成为一个单独的算法,即具体策略。策略模式使用多个类来区别不同的行为,使用策略模式避免暴露复杂的、与算法相关的内部数据结构。当一个类中的操作以多个条件分支语句的形式出现的时候,可以使用策略模式将相关的条件分支移入各自的具体策略类中以代替这些条件语句,从而减少系统处理的复杂度。
优点:
1、 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
缺点:
1、因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
UML图如下:
简单示例代码:
//策略类基类 class Strategy { public: virtual void algorithmInterface() = 0; //定义一个通用的算法接口 virtual ~Strategy(){}; protected: Strategy(){}; }; //具体策略:打五折 class FiveAbateStrategy : public Strategy { public: virtual void algorithmInterface(); }; void FiveAbateStrategy::algorithmInterface() { cout<<"喜迎国庆,全场商品打五折"<<endl; } //具体策略:打八折 class EightAbateStrategy : public Strategy { public: virtual void algorithmInterface(); }; void EightAbateStrategy::algorithmInterface() { cout<<"双11,求脱光,全场商品打八折"<<endl; } //上下文:持有一个策略类的引用,最终给客户端调用。 class Context { public: Context(Strategy *pStrategy); ~Context(); void contextInterface(); private: Strategy *m_pStrategy; }; Context::Context(Strategy *pStrategy) : m_pStrategy(pStrategy) { } Context::~Context() { delete m_pStrategy; m_pStrategy = NULL; } void Context::contextInterface() { m_pStrategy->algorithmInterface(); } int _tmain(int argc, _TCHAR* argv[]) { Strategy *pStrategy = new EightAbateStrategy; Context *pContext = new Context(pStrategy); pContext->contextInterface(); return 0; }