Strategy(策略)
22. Strategy(策略)
22.1 定义
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,使得算法可以在不影响到客户端的情况下发生变化
22.2 优点
■ 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族,恰当地使用继承可以把公共的代码移到父类中,从而避免代码重复。
■ 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为,如果不用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样算法或行为的使用者就和算法本身混在一起,从而不可能再独立演化。
■ 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,这比使用继承的办法还要原始和落后。
22.3. 策略模式的缺点策略模式的缺点如下。
■ 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类,即策略模式只适用于客户端知道所有的算法或行为的情况。
■ 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保持到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。可以使用享元模式来减少对象的数量
22.4 使用场景
■ 多个类只是在算法或行为上稍有不同的场景。
■ 算法需要自由切换的场景。
■ 需要屏蔽算法规则的场景。
1 #include<iostream> 2 using namespace std; 3 class DisCountStrategy { 4 protected: 5 double price = 0; 6 int number = 0; 7 public: 8 DisCountStrategy() { 9 10 } 11 DisCountStrategy(double price,int number) { 12 this->price = price; 13 this->number = number; 14 } 15 double getPrice() { 16 return price; 17 } 18 int getNumber() { 19 return number; 20 } 21 virtual double calculateDiscount() = 0; 22 }; 23 class NoDiscountStrategy:public DisCountStrategy { 24 public: 25 NoDiscountStrategy(double price, int number){ 26 this->price = price; 27 this->number = number; 28 } 29 double calculateDisCount() { 30 return 0; 31 } 32 }; 33 class FixDiscountStrategy :public DisCountStrategy { 34 public: 35 FixDiscountStrategy(double price, int number) { 36 this->price = price; 37 this->number = number; 38 } 39 double calculateDisCount() { 40 return getNumber()*1; 41 } 42 }; 43 class PercentageDiscountStrategy :public DisCountStrategy { 44 public: 45 PercentageDiscountStrategy(double price, int number) { 46 this->price = price; 47 this->number = number; 48 } 49 double calculateDisCount() { 50 return getNumber() * getPrice()*0.15; 51 } 52 };
我心自有明月在,不堕地狱不跪佛

浙公网安备 33010602011771号