策略模式(strategy)

发布时间 2023-12-12 15:31:52作者: 泽良_小涛
  1 #include <iostream>
  2 using namespace std;
  3 
  4 //设计思想:我们父类和子类就是一个扩展的关系?是不是合适
  5 //里氏代换原则:子类对象就应该能完全替代父类的行为
  6 //对于继承这样设计,特别小心,我们:组合大于继承
  7 //把quack和fly抽象成为一个对象,那么这个问题就了解决方案
  8 
  9 
 10 //////////////////////////
 11 //完成了将“动作”抽象成“对象”
 12 class QuackBehavior {
 13 public:
 14     virtual void quack() = 0;
 15 protected:
 16     QuackBehavior(){} 
 17 };
 18 class FlyBehavior {
 19 public:
 20     virtual void fly() = 0;
 21 protected:
 22     FlyBehavior(){}
 23 };
 24 
 25 class FlyWithRocket :public FlyBehavior {
 26     void fly() {
 27         cout << "做着火箭飞" << endl;
 28     }
 29 };
 30 
 31 class FlyWithWings :public FlyBehavior {
 32     void fly() {
 33         cout << "我有翅膀可以自己飞" << endl;
 34     }
 35 };
 36 
 37 class FlyWithNoWay :public FlyBehavior {
 38     void fly() {
 39         cout << "我根本就会飞" << endl;
 40     }
 41 };
 42 
 43 class ZhiZhiQuack :public QuackBehavior {
 44 public:    void quack() {
 45     cout << "吱吱" << endl;
 46     }
 47 };
 48 
 49 class PersonQuack :public QuackBehavior {
 50 public:
 51     void quack() {
 52         cout << "我是唐唐姥姥" << endl;
 53     }
 54 };
 55 
 56 class WigeonQuack :public QuackBehavior {
 57 public:
 58     void quack() {
 59         cout << "丑小鸭变天鹅" << endl;
 60     }
 61 };
 62 
 63 /////////////////////////////////////
 64 //Duck has a Quack 
 65 //     has a Fly
 66 class Duck {
 67 
 68 public:
 69     
 70     virtual void Display() = 0;
 71     void setFlyBehavior(FlyBehavior* fb) {
 72         m_pFly = fb;
 73     }
 74     void setQuackBehavior(QuackBehavior* qb) {
 75         m_pQuack = qb;
 76     }
 77 
 78     virtual void perfomrFly() {
 79         m_pFly->fly();
 80 
 81         //if (is 唐老鸭) {唐老鸭的飞行
 82         //if (is 小黄鸭){小黄鸭的飞行.....
 83     }
 84 
 85     virtual void performQuack() {
 86         m_pQuack->quack();
 87     }
 88 protected:
 89     QuackBehavior *m_pQuack;
 90     FlyBehavior *m_pFly;
 91 private:
 92 };
 93 //DonaladDuck is Duck
 94 class DonaladDuck :public Duck {
 95 public:
 96     DonaladDuck() {
 97         m_pFly = new FlyWithRocket;//某一个FlyBehavior的实例
 98         m_pQuack = new PersonQuack();
 99     }
100     void Display() {
101         perfomrFly();
102         performQuack();
103     }
104     
105 };
106 //第一个困境:子类似乎不太那么像父类。。。
107 class RuberDuck : public Duck {
108 public:
109     RuberDuck() {
110         m_pFly = new FlyWithNoWay();
111         m_pQuack = new ZhiZhiQuack();
112     }
113     void Display() {
114         perfomrFly();
115         performQuack();
116     }
117 };
118 
119 class WigeonDuck : public Duck {
120 public:
121     WigeonDuck() {
122         m_pFly = new FlyWithWings;
123         m_pQuack = new WigeonQuack;
124     }
125     void Display() {
126         perfomrFly();
127         performQuack();
128     }
129     
130 };
131 
132 int main() {
133     DonaladDuck *pDonlad = new DonaladDuck;
134     pDonlad->Display();
135     system("pause");
136     return 0;
137 }
138 //
139 class XiaoFeiXia :public Duck {
140     //
141     //m_pFly = new FlyWithHotPollun()
142 };
strategy.cpp