码迷,mamicode.com
首页 > 其他好文 > 详细

策略模式(Strategy Pattern)

时间:2016-08-10 22:46:24      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

 

策略模式(Strategy Pattern)

 

  抛开晦涩的定义,首先看一个例子:

  我们想要创建一个模拟鸭子的游戏,在这个游戏中,会有各种类型的鸭子,比如mallard duck,red head duck,rubber duck(除了rubber duck(橡皮鸭),看见这其余两种鸭子很好奇,于是查找相关图片,发现mallard duck是绿头鸭,red head duck是红头鸭,自己生活中还没有见过,有趣,哈哈!三种鸭子图片如下所示)。

技术分享技术分享技术分享

  回归话题,在这个模拟鸭子的游戏中,各种鸭子均有两种能力,即游泳(swim)和呱呱叫(quack)。根据以上描述,进行类设计。

  假设以前我们没有学过策略模式,那么我们一定会设计一个基类duck,具有swim和quack属性,然后令mallard duck和red head duck继承基类duck。具体类图如下:

  技术分享

  根据这个类设计图可以编写如下代码:

技术分享
 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Duck {
 5     public:
 6          void quack(){cout << "        I‘m quacking!" << endl;}  
 7          void swim() {cout << "        I‘m swimming!" << endl;}  
 8          void display();
 9 };
10 
11 class MallardDuck:public Duck {
12     public:
13         void display() {
14             cout << "This is Mallard Duck:" << endl;
15             quack();
16             swim();
17         }
18 };
19 class RedHeadDuck :public Duck {
20     public:
21         void display() {
22             cout << "This is Red Head Duck:" << endl;
23             quack();
24             swim();
25         }
26 };
27 class RubberDuck :public Duck {
28 public:
29     void display() {
30         cout << "This is Rubber Duck:" << endl;
31         quack();
32         swim();
33     }
34 };
35 
36 
37 
38 
39 int main() {
40     MallardDuck mallard_duck;
41     RedHeadDuck redhead_duck;
42     RubberDuck rubber_duck;
43     mallard_duck.display();
44     redhead_duck.display();
45     rubber_duck.display();
46     system("pause");
47     return 0;
48 }
View Code

  技术分享

   大多数人会想到上述的设计方式,这种设计方式在以后的扩展中会遇到问题,如果要在这个模拟鸭子的游戏中新添加一个飞翔的功能,那我们可能就会轻易的在基类duck中添加一个fly函数,然后不同种类的鸭子继承此基类,实行飞行,改变后的类图如下:

技术分享

   相应代码:

技术分享
 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Duck {
 5     public:
 6          void quack(){cout << "        I‘m quacking!" << endl;}  
 7          void swim() {cout << "        I‘m swimming!" << endl;}  
 8          void fly() { cout << "        I‘m flying!" << endl; }
 9          void display();
10 };
11 
12 class MallardDuck:public Duck {
13     public:
14         void display() {
15             cout << "This is Mallard Duck:" << endl;
16             quack();
17             swim();
18             fly();
19         }
20 };
21 class RedHeadDuck :public Duck {
22     public:
23         void display() {
24             cout << "This is Red Head Duck:" << endl;
25             quack();
26             swim();
27             fly();
28         }
29 };
30 class RubberDuck :public Duck {
31 public:
32     void display() {
33         cout << "This is Rubber Duck:" << endl;
34         quack();
35         swim();
36         fly();
37     }
38 };
39 
40 
41 
42 
43 int main() {
44     MallardDuck mallard_duck;
45     RedHeadDuck redhead_duck;
46     RubberDuck rubber_duck;
47     mallard_duck.display();
48     redhead_duck.display();
49     rubber_duck.display();
50     system("pause");
51     return 0;
52 }
View Code

  程序结果:

技术分享

  这时发现一个问题,Rubber Duck(橡皮鸭)居然也会飞,我们并不想让橡皮鸭飞行,怎么做呢?我们可以在橡皮鸭的类里面将fly覆盖掉,并且不做任何事情。

  今天晚上累了,先休息会...........

 

 

 

策略模式(Strategy Pattern)

标签:

原文地址:http://www.cnblogs.com/GoFly/p/5758975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!