抛开晦涩的定义,首先看一个例子:
我们想要创建一个模拟鸭子的游戏,在这个游戏中,会有各种类型的鸭子,比如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 }
大多数人会想到上述的设计方式,这种设计方式在以后的扩展中会遇到问题,如果要在这个模拟鸭子的游戏中新添加一个飞翔的功能,那我们可能就会轻易的在基类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 }
程序结果:
这时发现一个问题,Rubber Duck(橡皮鸭)居然也会飞,我们并不想让橡皮鸭飞行,怎么做呢?我们可以在橡皮鸭的类里面将fly覆盖掉,并且不做任何事情。
今天晚上累了,先休息会...........
原文:http://www.cnblogs.com/GoFly/p/5758975.html