动机( Motivation )
>在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂,而且有时候支持不使用的算法也是一个性能负担。
>如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?
普通结构式程序:
enum TaxBase{ CN_Tax, US_Tax, DE_Tax, //改动 FR_Tax }; class SaleOrder{ TaxBase tax; public: double CalculateTax() { if (tax == CN_tax){ //CN*********** } else if (tax == US_Tax) { //CN*********** } else if (tax == DE_Tax) { //DE*********** } //改动 else if (tax == FR_Tax) { //FR*********** } //......... } };
策略模式代码
class TaxStrategy{ public: virtual double Calculate(const context& context) = 0; virtual ~TastStrategy(){} }; class CNTex :public TaxStrategy{ public: virtual double Calculate(const Context& context){ //**************** } }; class USTax :public TaxStrategy{ public: virtual double Calculate(const Context& context){ //**************** } }; class DETax :public TaxStrategy{ public: virtual double Calculate(const Context& context){ //**************** } }; //**********扩展************ class FRTax :public TaxStrategy{ public: virtual double Calculate(const Context& context){ //**************** } }; //*************************** //复用性,不需要更改 class SalesOrder{ private: TaxStrategy* strategy; //多态指针 public: SalesOrder(StrategyFactory* strategyFactory){ this->strategy = strategyFactory->NewStrategy(); } ~SalesOrder(){ delete this->strategy; } public double ClaculateTax(){ //..... Context context(); double val = strategy->Calculate(context); //多态调用 //..... } };