大话设计模式学习--策略模式(Strategy)

 

Strategy模式也叫策略模式,是由GoF提出的23种软件设计模式的一种。Strategy模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换。

本文介绍设计模式中的(Strategy)模式的概念,用法,以及实际应用中怎么样使用Strategy模式进行开发。
Strategy模式的概念与应用场景
概要:
- Strategy模式定义一个算法族,并把每一种可能的算法封装成一个类,这些算法可以在应用程序内部被动态替换。策略模式可以降低客户端与算法之间的耦合关系。
- 这些算法具有一个相同的抽象接口,具体的算法通过继承的子类实现。
一个应用程序需要动态切换算法的时候,Strategy模式便变得非常有用。

Strategy模式的应用场景一般是:
- 具有多种可能需要实现的算法
- 需要在程序中对算法进行动态切换

Strategy模式UML类图

Strategy模式的角色:
Strategy
    策略(算法)抽象。
ConcreteStrategy
    各种策略(算法)的具体实现。
Context
    策略的外部封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定。


Strategy模式的应用范例
商场打折的方式很多,如打八折,五折,满300返100等。
#ifndef __CASH_H__ 2 #define __CASH_H__ 3 4 /************************************* 5 * 抽象策略设计模式 6 ************************************/ 7 #include 8 9 /************************************ 10 * 抽象父类,现金类,定义了纯虚函数 11 * *********************************/ 12 class CashSuper 13 { 14 public: 15 virtual double acceptCash(double money)=0; 16 }; 17 18 /************************************* 19 * 子类,根据不同的策略,定义不同的子类 20 * 这个是打折的策略子类 21 ************************************/ 22 class CashRebat : public CashSuper 23 { 24 public: 25 CashRebat(double rebat) 26 : moneyRebat(rebat) 27 { 28 } 29 30 double acceptCash(double money) 31 { 32 return money * moneyRebat; 33 } 34 private: 35 double moneyRebat; 36 }; 38 /************************************** 39 * 满300返100的策略子类 40 * ***********************************/ 41 class CashReturn : public CashSuper 42 { 43 public: 44 CashReturn(double condition, double ret) 45 : moneyCondition(condition), moneyReturn(ret) 46 { 47 } 48 49 double acceptCash(double money) 50 { 51 if(money >= moneyCondition) 52 return money - moneyReturn; 53 else 54 return money; 55 } 56 57 private: 58 double moneyCondition; 59 double moneyReturn; 60 }; 61 62 /**************************************** 63 * 简单工厂类 64 * *************************************/ 65 class CashFactory 66 { 67 public: 68 static CashSuper* createCashAccept(int type) 69 { 70 CashSuper *cash; 71 switch(type) 72 { 73 case 1: 74 cash = new CashRebat(0.8); 75 break; 76 case 2: 77 cash = new CashRebat(0.5); 78 break; 79 case 3: 80 cash = new CashReturn(300, 100); 81 break; 82 } 83 return cash; 84 } 85 }; 86 87 /***************************************** 88 * 策略模式设计 89 * **************************************/ 90 class CashContext 91 { 92 public: 93 CashContext(CashSuper *csuper) 94 : cash(csuper) 95 { 96 } 97 98 double GetResult(double money) 99 { 100 return cash->acceptCash(money); 101 } 102 103 private: 104 CashSuper *cash; 105 }; 106 107 /**************************************** 108 * 策略模式与简单工厂模式相结合 109 * 改造后的CashContext 110 * *************************************/ 111 class CashContext_new 112 { 113 public: 114 CashContext_new(int type) 115 { 116 switch(type) 117 { 118 case 1: 119 cash = new CashRebat(0.8); 120 break; 121 case 2: 122 cash = new CashRebat(0.5); 123 break; 124 case 3: 125 cash = new CashReturn(300, 100); 126 break; 127 } 128 } 129 130 double GetResult(double money) 131 { 132 return cash->acceptCash(money); 133 } 134 135 private: 136 CashSuper *cash; 137 }; 138 139 #endif  
client的代码:
1 #include 2 #include 3 4 #include "cash.h" 5 6 int main() 7 { 8 /********************* 9 * 简单工厂模式client 10 ********************/ 11 CashSuper *cash; 12 CashFactory f; 13 cash = f.createCashAccept(3); 14 std::cout << cash->acceptCash(500) << std::endl; 15 delete cash; 16 17 /******************** 18 * 策略模式client 19 * ******************/ 20 CashContext cc(new CashRebat(0.8)); 21 std::cout << cc.GetResult(100.0) << std::endl; 22 23 /******************* 24 * 策略模式与简单工厂模式相结合的client 25 * 我们只需要一个类CashContext_new,就可以完成工作 26 * 大大降低了耦合性 27 * ************************************/ 28 CashContext_new ccn(1); 29 std::cout << ccn.GetResult(100.0) << std::endl; 30 exit(0); 31 } 
参考: http://www.lifevv.com/sysdesign/doc/20071203214955037.html

 

你可能感兴趣的:(c)