您的位置:首页 > 其它

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

2010-10-20 13:24 387 查看

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 <iostream>
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 <iostream>
2 #include <stdlib.h>
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: