简介

概念

设计模式是在特定环境下人们解决某类重复出现问题的一套成功 或有效的解决方案。一开始出现于建筑行业,后来被引入到计算机领域.

软件设计模式,是指在软件设计中,被反复使用的一种代码设计经验。使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性。

设计模式这个术语是上个世纪90年代由Erich Gamma、Richard Helm、Raplh Johnson和Jonhn Vlissides四个人总结提炼出来的,并且写了一本Design Patterns的书。这四人也被称为四人帮(GoF)。

种类

GoF 提出的设计模式有 23 个,包括:

  1. 创建型(Creational)模式: 如何创建对象;
  2. 结构型(Structural )模式: 如何实现类或对象的组合;
  3. 行为型(Behavioral)模式: 类或对象怎样交互以及怎样分配职责。

    有一个“简单工厂模式”不属于 GoF 23 种设计模式,但大部分的设计模式 书籍都会对它进行专门的介绍.
    所以,设计模式目前种类: GoF 的 23 种 + “简单工厂模式” = 24 种。
    这里只学习一部分比较常用的设计模式,看全部可以—>

    设计原则

    为什么要使用设计模式?根本原因还是软件开发要实现可维护、可扩展,就必须尽量复用代码,并且降低代码的耦合度。(高内聚,低耦合)设计模式主要是基于OOP编程提炼的,它基于以下几个原则:

  4. 单一职责原则: 类的职责单一,对外只提供一种功能,而引起类变化的 原因都应该只有一个

  5. 开闭原则:软件应该对扩展开放,而对修改关闭。这里的意思是在增加新功能的时候,能不改代码就尽量不要改,如果只增加代码就完成了新功能,那是最好的。
  6. 里氏替换原则: 任何抽象类出现的地方都可以用他的实现类进行替换, 实际就是虚拟机制,语言级别实现面向对象功能.
  7. 接口隔离原则: 不应该强迫用户的程序依赖他们不需要的接口方法。一 个接口应该只提供一种对外功能,不应该把所有操作都 封装到一个接口中去
  8. 合成复用原则: 如果使用继承,会导致父类的任何变换都可能影响到子 类的行为。如果使用对象组合,就降低了这种依赖关系。 对于继承和组合,优先使用组合
  9. 迪米特法则:一个对象应当对其他对象尽可能少的了解,从而降 低各个对象之间的耦合,提高系统的可维护性。 ```cpp //开闭原则:新增功能,尽量不修改代码,而是增加代码 class Caculator { private: double mA; string mOpt; double mB;

public: Caculator(double a, string opt, double b) : mA(a), mOpt(opt), mB(b) {} double getResult() { if (this->mOpt == “+”) { return this->mA + this->mB; } else if (this->mOpt == “-“) { return this->mA - this->mB; } //… } }; //开闭原则写法—> class AbstractCaculator { public: double mA; double mB;

public: AbstractCaculator(double a, double b) : mA(a), mB(b) {} virtual double getResult() = 0; };

class PlusCaculator : public AbstractCaculator { public: PlusCaculator(double a, double b) : AbstractCaculator(a,b){} double getResult() { return mA + mB; } }; class MinusCaculator : public AbstractCaculator { public: MinusCaculator(double a, double b) : AbstractCaculator(a,b){} double getResult() { return mA - mB; } }; //…使用这种写法,可扩展性强

  1. 其他案例:<br />迪米特原则(最少知识原则):租房客有很多出租屋可选择.租房客只需要租金..信息,不需要知道建筑材料..信息,可添加一个中介,提供给租房客需要的信息和服务.<br />合成复用原则:优先使用组合而不是继承<br />依赖倒转原则:传统高层依赖于底层,耦合性高,在中间加入抽象层.
  2. <a name="RGZVQ"></a>
  3. ## 创建型模型
  4. <a name="og80m"></a>
  5. ### 1.简单工厂模式
  6. ![简单工厂模式.png](https://cdn.nlark.com/yuque/0/2022/png/21546446/1657023914446-8a2f7684-aa35-4d0d-aaf8-b7412e61ee8a.png#clientId=u691de596-70cd-4&crop=0&crop=0&crop=1&crop=1&from=ui&id=u68e3919d&margin=%5Bobject%20Object%5D&name=%E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F.png&originHeight=604&originWidth=1360&originalType=binary&ratio=1&rotation=0&showTitle=false&size=45685&status=done&style=none&taskId=u26ea860d-e533-464c-a71b-fdbadfb3b16&title=)
  7. ```cpp
  8. #include <iostream>
  9. using namespace std;
  10. class AbstractPhone
  11. {
  12. public:
  13. virtual void show() = 0;
  14. };
  15. class HuaWei : public AbstractPhone
  16. {
  17. public:
  18. void show()
  19. {
  20. cout << "我是爱国牌手机!" << endl;
  21. }
  22. };
  23. class RedMi : public AbstractPhone
  24. {
  25. public:
  26. void show()
  27. {
  28. cout << "我是红米,干翻小米!" << endl;
  29. }
  30. };
  31. class PhoneFactory
  32. {
  33. public:
  34. static AbstractPhone *CreateObject(string name)
  35. {
  36. if (name == "huawei")
  37. {
  38. return new HuaWei;
  39. }
  40. else if (name == "redmi")
  41. {
  42. return new RedMi;
  43. }
  44. }
  45. };
  46. int main(int argc, char const *argv[])
  47. {
  48. AbstractPhone * phone = NULL;
  49. phone = PhoneFactory::CreateObject("huawei");
  50. phone->show();
  51. delete phone;
  52. phone = NULL;
  53. return 0;
  54. }

2. 工厂方法模式

工厂方法模式.png

  1. #include <iostream>
  2. using namespace std;
  3. class AbstractPhone
  4. {
  5. public:
  6. virtual void show() = 0;
  7. };
  8. class HuaWei : public AbstractPhone
  9. {
  10. public:
  11. void show()
  12. {
  13. cout << "我是爱国牌手机!" << endl;
  14. }
  15. };
  16. class RedMi : public AbstractPhone
  17. {
  18. public:
  19. void show()
  20. {
  21. cout << "我是红米,干翻小米!" << endl;
  22. }
  23. };
  24. class AbstractFactory
  25. {
  26. public:
  27. virtual AbstractPhone *CreateObject() = 0;
  28. };
  29. class HuaweiFactory : public AbstractFactory
  30. {
  31. public:
  32. AbstractPhone *CreateObject()
  33. {
  34. return new HuaWei;
  35. }
  36. };
  37. class RedMiFactory : public AbstractFactory
  38. {
  39. public:
  40. AbstractPhone *CreateObject()
  41. {
  42. return new RedMi;
  43. }
  44. };
  45. int main(int argc, char const *argv[])
  46. {
  47. AbstractPhone *phone = NULL;
  48. AbstractFactory *factroy = new HuaweiFactory;
  49. phone = factroy->CreateObject();
  50. phone->show();
  51. delete phone;
  52. phone = NULL;
  53. delete factroy;
  54. factroy = NULL;
  55. return 0;
  56. }

3.抽象工厂模式

由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统 中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关 的产品组成一个“产品族,由同一个工厂来统一生产 .

  1. //在以上案例扩展,假如每个品牌的工厂都生产两类手机,高端和低端.
  2. //华为高端机,华为低端机,红米高端机,红米低端机.
  3. //再定义一种抽象工厂类,包括生产高端,生产低端的方法
  4. #include <iostream>
  5. using namespace std;
  6. class AbstractPhone
  7. {
  8. public:
  9. virtual void show() = 0;
  10. };
  11. class HuaWeiHigh : public AbstractPhone
  12. {
  13. public:
  14. virtual void show()
  15. {
  16. cout << "我是爱国牌高端手机!" << endl;
  17. }
  18. };
  19. class HuaWeiLow : public AbstractPhone
  20. {
  21. public:
  22. virtual void show()
  23. {
  24. cout << "我是爱国牌低端手机!" << endl;
  25. }
  26. };
  27. class RedMiHigh : public AbstractPhone
  28. {
  29. public:
  30. virtual void show()
  31. {
  32. cout << "我是红米高端机" << endl;
  33. }
  34. };
  35. class RedMiLow : public AbstractPhone
  36. {
  37. public:
  38. virtual void show()
  39. {
  40. cout << "我是红米低端机!" << endl;
  41. }
  42. };
  43. class AbstractFactory
  44. {
  45. public:
  46. virtual AbstractPhone *CreateHigh() = 0;
  47. virtual AbstractPhone *CreateLow() = 0;
  48. };
  49. class HuaweiFactory : public AbstractFactory
  50. {
  51. public:
  52. AbstractPhone *CreateHigh()
  53. {
  54. return new HuaWeiHigh;
  55. }
  56. AbstractPhone *CreateLow()
  57. {
  58. return new HuaWeiLow;
  59. }
  60. };
  61. class RedMiFactory : public AbstractFactory
  62. {
  63. public:
  64. AbstractPhone *CreateHigh()
  65. {
  66. return new RedMiHigh;
  67. }
  68. AbstractPhone *CreateLow()
  69. {
  70. return new RedMiLow;
  71. }
  72. };
  73. int main(int argc, char const *argv[])
  74. {
  75. AbstractPhone *phone = NULL;
  76. AbstractFactory *factroy = new HuaweiFactory;
  77. phone = factroy->CreateHigh();
  78. phone->show();
  79. delete phone;
  80. phone = NULL;
  81. delete factroy;
  82. factroy = NULL;
  83. return 0;
  84. }

4.生成器模式

将一个复杂的对象的构建(builder)和它的表示(director)分离,使得同样的构建过程可以创建不同的表示。核心是给指导者一个生成器,但具体方式不指定。

  1. #include <iostream>
  2. #include <list>
  3. using namespace std;
  4. //产品类,由多个部件组成
  5. class Product
  6. {
  7. private:
  8. list<string> parts;
  9. public:
  10. // 添加产品部件
  11. void add(string part)
  12. {
  13. parts.push_back(part);
  14. }
  15. // 列举所有的产品部件
  16. void show()
  17. {
  18. cout << "---产品 创建---"<<parts.size() << endl;
  19. for (string part : parts)
  20. {
  21. cout << part << endl;
  22. }
  23. }
  24. };
  25. //抽象类或接口
  26. class Builder
  27. {
  28. public:
  29. Product product;
  30. Product getProduct()
  31. {
  32. return product;
  33. }
  34. virtual void buildPartA() = 0;
  35. virtual void buildPartB() = 0;
  36. };
  37. //指挥者类,用来指挥建造过程
  38. class Director
  39. {
  40. public:
  41. void construct(Builder * builder)
  42. {
  43. builder->buildPartA();
  44. builder->buildPartB();
  45. }
  46. };
  47. //具体建造者类
  48. class ConcreteBuilder1 : public Builder
  49. {
  50. public:
  51. virtual void buildPartA()
  52. {
  53. product.add("部件A");
  54. }
  55. virtual void buildPartB()
  56. {
  57. product.add("部件B");
  58. }
  59. };
  60. // 具体建造者类,建造的对象时Product,通过build使Product完善
  61. class ConcreteBuilder2 : public Builder
  62. {
  63. public:
  64. void buildPartA()
  65. {
  66. product.add("部件X");
  67. }
  68. void buildPartB()
  69. {
  70. product.add("部件Y");
  71. }
  72. };
  73. //建造客户端
  74. int main(int argc, char const *argv[])
  75. {
  76. Director director;
  77. Builder * builder1 = new ConcreteBuilder1;
  78. Builder * builder2 = new ConcreteBuilder2;
  79. director.construct(builder1);
  80. Product product1 = builder1->getProduct();
  81. product1.show();
  82. director.construct(builder2);
  83. Product product2 = builder2->getProduct();
  84. product2.show();
  85. return 0;
  86. }

5.单例模式

通过单例模式可以保证系统中一个类只有一个实例而且该实例易 于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某 个类的对象只能存在一个,单例模式是最好的解决方案。

实现步骤:

  1. 构造方法私有,不给new
  2. 提供静态方法返回唯一的对象 ```cpp //懒汉式:线程不安全

    include

    using namespace std; class singleton { private: singleton(){}//不给new static singleton s_singleton; public: static singleton getInstance(){
    1. if(s_singleton == NULL){//多线程时,可能同时判断为NULL
    2. s_singleton = new singleton;
    3. }
    4. return s_singleton;
    }

}; singleton singleton::s_singleton = NULL; int main(int argc, char const argv[]) { singleton s1 = singleton::getInstance(); singleton s2 = singleton::getInstance();

  1. cout<<"同一对象?"<<(s1==s2?"是":"否")<<endl;
  2. return 0;

} //饿汉式

include

using namespace std; class singleton { private: singleton(){}//不给new static singleton s_singleton; public: static singleton getInstance(){ return s_singleton; }

}; singleton singleton::s_singleton = new singleton;//区别处 int main(int argc, char const argv[]) { singleton s1 = singleton::getInstance(); singleton s2 = singleton::getInstance();

  1. cout<<"同一对象?"<<(s1==s2?"是":"否")<<endl;
  2. return 0;

}

  1. <a name="Ji5Ex"></a>
  2. ## 结构型模式
  3. <a name="EkZey"></a>
  4. ### 6.代理模式
  5. 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某 些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客 户端和目标对象之间起到中介的作用。
  6. ```cpp
  7. #include <iostream>
  8. using namespace std;
  9. class AbstractCommonInterface
  10. {
  11. public:
  12. virtual void run() = 0;
  13. };
  14. class System : public AbstractCommonInterface
  15. {
  16. public:
  17. void run()
  18. {
  19. cout << "系统功能" << endl;
  20. }
  21. };
  22. class systemProxy : public AbstractCommonInterface
  23. {
  24. public:
  25. System *system;
  26. bool isOK()
  27. {
  28. return true; //验证权限,这里直接给通过
  29. }
  30. void run()
  31. {
  32. if (isOK())
  33. {
  34. this->system = new System;
  35. this->system->run();
  36. }
  37. }
  38. ~systemProxy()
  39. {
  40. if (this->system != NULL)
  41. {
  42. delete this->system;
  43. }
  44. }
  45. };
  46. int main(int argc, char const *argv[])
  47. {
  48. systemProxy sProxy;
  49. sProxy.run();
  50. return 0;
  51. }

7.外观模式

Facade 模式也叫外观模式,是由 GoF 提出的 23 种设计模式中的一种。 Facade 模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一 致的简单的界面。这个一致的简单的界面被称作 facade

  1. #include <iostream>
  2. using namespace std;
  3. //电视
  4. class Television
  5. {
  6. public:
  7. void On()
  8. {
  9. cout << "电视打开!" << endl;
  10. }
  11. void Off()
  12. {
  13. cout << "电视关闭!" << endl;
  14. }
  15. };
  16. //灯
  17. class Lamp
  18. {
  19. public:
  20. void On()
  21. {
  22. cout << "灯打开!" << endl;
  23. }
  24. void Off()
  25. {
  26. cout << "灯关闭!" << endl;
  27. }
  28. };
  29. //音响
  30. class Audio
  31. {
  32. public:
  33. void On()
  34. {
  35. cout << "音响打开!" << endl;
  36. }
  37. void Off()
  38. {
  39. cout << "音响关闭!" << endl;
  40. }
  41. };
  42. //麦克风
  43. class Microphone
  44. {
  45. public:
  46. void On()
  47. {
  48. cout << "麦克风打开!" << endl;
  49. }
  50. void Off()
  51. {
  52. cout << "麦克风关闭!" << endl;
  53. }
  54. };
  55. // DVD 播放机
  56. class DVDPlayer
  57. {
  58. public:
  59. void On()
  60. {
  61. cout << "DVDPlayer 打开!" << endl;
  62. }
  63. void Off()
  64. {
  65. cout << "DVDPlayer 关闭!" << endl;
  66. }
  67. };
  68. //游戏机
  69. class GameMachine
  70. {
  71. public:
  72. void On()
  73. {
  74. cout << "游戏机打开!" << endl;
  75. }
  76. void Off()
  77. {
  78. cout << "游戏界关闭!" << endl;
  79. }
  80. };
  81. //外观抽象类
  82. class AbstractFacede
  83. {
  84. public:
  85. virtual void On() = 0;
  86. virtual void Off() = 0;
  87. };
  88. //游戏模式
  89. class GameMode : public AbstractFacede
  90. {
  91. public:
  92. GameMode()
  93. {
  94. pTelevision = new Television;
  95. pAudio = new Audio;
  96. pGameMachine = new GameMachine;
  97. }
  98. virtual void On()
  99. {
  100. pTelevision->On();
  101. pAudio->On();
  102. pGameMachine->On();
  103. }
  104. virtual void Off()
  105. {
  106. pTelevision->Off();
  107. pAudio->Off();
  108. pGameMachine->Off();
  109. }
  110. private:
  111. Television *pTelevision;
  112. Audio *pAudio;
  113. GameMachine *pGameMachine;
  114. };
  115. // KTV 模式
  116. class KTVMode : public AbstractFacede
  117. {
  118. public:
  119. KTVMode()
  120. {
  121. pTelevision = new Television;
  122. pAudio = new Audio;
  123. pDVDPlayer = new DVDPlayer;
  124. pLamp = new Lamp;
  125. pMicrophone = new Microphone;
  126. }
  127. virtual void On()
  128. {
  129. pTelevision->On();
  130. pAudio->On();
  131. pDVDPlayer->On();
  132. pLamp->Off();
  133. pMicrophone->On();
  134. }
  135. virtual void Off()
  136. {
  137. pTelevision->Off();
  138. pAudio->Off();
  139. pDVDPlayer->Off();
  140. pLamp->On();
  141. pMicrophone->Off();
  142. }
  143. private:
  144. Television *pTelevision;
  145. Audio *pAudio;
  146. DVDPlayer *pDVDPlayer;
  147. Lamp *pLamp;
  148. Microphone *pMicrophone;
  149. };
  150. //测试游戏模式和 KTV 模式
  151. void test01()
  152. {
  153. AbstractFacede *facede = NULL;
  154. facede = new GameMode;
  155. facede->On(); //启动游戏模式
  156. delete facede;
  157. cout << "--------------------------" << endl;
  158. facede = new KTVMode;
  159. facede->On(); //启动 KTV 模式
  160. delete facede;
  161. }
  162. int main()
  163. {
  164. test01();
  165. return EXIT_SUCCESS;
  166. }

8.适配器模式

将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容 而不能一起工作的那些类可以一起工作。

  1. #include <iostream>
  2. #include <list>
  3. using namespace std;
  4. // A 需要治疗感冒
  5. class PersonA
  6. {
  7. public:
  8. void treatGanmao()
  9. {
  10. cout << "A 需要治疗感冒!" << endl;
  11. }
  12. };
  13. // B 需要治疗头疼
  14. class PersonB
  15. {
  16. public:
  17. void treatTouteng()
  18. {
  19. cout << "B 需要治疗头疼!" << endl;
  20. }
  21. };
  22. //目标接口
  23. class Target
  24. {
  25. public:
  26. virtual void treat() = 0;
  27. };
  28. //将 PersonA 的 treatGanmao 接口适配成 treat
  29. class AdapterPersonA : public Target
  30. {
  31. public:
  32. AdapterPersonA()
  33. {
  34. pPerson = new PersonA;
  35. }
  36. virtual void treat()
  37. {
  38. pPerson->treatGanmao();
  39. }
  40. private:
  41. PersonA *pPerson;
  42. };
  43. //将 PersonB 的 treatTouteng 接口适配成 treat
  44. class AdapterPersonB : public Target
  45. {
  46. public:
  47. AdapterPersonB()
  48. {
  49. pPerson = new PersonB;
  50. }
  51. virtual void treat()
  52. {
  53. pPerson->treatTouteng();
  54. }
  55. private:
  56. PersonB *pPerson;
  57. };
  58. //医生
  59. class Doctor
  60. {
  61. public:
  62. void addPatient(Target *patient)
  63. {
  64. m_list.push_back(patient);
  65. }
  66. void startTreat()
  67. {
  68. for (list<Target *>::iterator it = m_list.begin(); it != m_list.end(); it++)
  69. {
  70. (*it)->treat();
  71. }
  72. }
  73. private:
  74. list<Target *> m_list;
  75. };
  76. void test01()
  77. {
  78. //创建三个病人
  79. Target *patient1 = new AdapterPersonA;
  80. Target *patient2 = new AdapterPersonB;
  81. //创建医生
  82. Doctor *doctor = new Doctor;
  83. doctor->addPatient(patient1);
  84. doctor->addPatient(patient2);
  85. //医生逐个对病人进行治疗
  86. doctor->startTreat();
  87. }
  88. int main()
  89. {
  90. test01();
  91. return EXIT_SUCCESS;
  92. }

9.装饰器模式

装饰模式又叫包装模式,通过一种对客户端透明的方式来扩展对象功能,是 继承关系的一种替代。 装饰模式就是把要附加的功能分别放在单独的类中,并让这个类包含它要装 饰的对象,当需要执行时,客户端就可以有选择的、按顺序的使用装饰功能包装 对象。

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. //抽象手机类
  5. class AbstractCellphone
  6. {
  7. public:
  8. virtual void showPhone() = 0;
  9. };
  10. //小米手机
  11. class XiaomiCellphone : public AbstractCellphone
  12. {
  13. public:
  14. XiaomiCellphone(string model)
  15. {
  16. m_name = "小米 " + model + "手机";
  17. }
  18. virtual void showPhone()
  19. {
  20. cout << m_name << endl;
  21. }
  22. private:
  23. string m_name;
  24. };
  25. // Apple 手机
  26. class AppleCellphone : public AbstractCellphone
  27. {
  28. public:
  29. AppleCellphone(string model)
  30. {
  31. m_name = "苹果 " + model + "手机";
  32. }
  33. virtual void showPhone()
  34. {
  35. cout << m_name << endl;
  36. }
  37. private:
  38. string m_name;
  39. };
  40. //装饰类
  41. class Decorator : public AbstractCellphone
  42. {
  43. public:
  44. Decorator(AbstractCellphone *cellphone)
  45. {
  46. pCellphone = cellphone;
  47. }
  48. virtual void showPhone()
  49. {
  50. pCellphone->showPhone();
  51. }
  52. protected:
  53. AbstractCellphone *pCellphone;
  54. };
  55. //给手机贴膜
  56. class CellphoneFilm : public Decorator
  57. {
  58. public:
  59. CellphoneFilm(AbstractCellphone *cellphone) : Decorator(cellphone) {}
  60. void addCellphoneFilm()
  61. {
  62. cout << "手机已贴膜!" << endl;
  63. }
  64. virtual void showPhone()
  65. {
  66. addCellphoneFilm();
  67. pCellphone->showPhone();
  68. }
  69. };
  70. //给手机装上手机壳
  71. class CellphoneShell : public Decorator
  72. {
  73. public:
  74. CellphoneShell(AbstractCellphone *cellphone) : Decorator(cellphone) {}
  75. void addShell()
  76. {
  77. cout << "手机已装上保护壳!" << endl;
  78. }
  79. virtual void showPhone()
  80. {
  81. addShell();
  82. pCellphone->showPhone();
  83. }
  84. };
  85. void test01()
  86. {
  87. //创建小米手机
  88. AbstractCellphone *cellphone = NULL;
  89. cellphone = new XiaomiCellphone("Note 女神版");
  90. cellphone->showPhone();
  91. cout << "-----------------------------" << endl;
  92. //给小米手机贴膜
  93. Decorator *cellphoneFilm = new CellphoneFilm(cellphone);
  94. cellphoneFilm->showPhone();
  95. cout << "-----------------------------" << endl;
  96. //给贴膜的小米手机再装上保护壳
  97. Decorator *cellphoneShell = new CellphoneShell(cellphoneFilm);
  98. cellphoneShell->showPhone();
  99. delete cellphoneShell;
  100. delete cellphoneFilm;
  101. delete cellphone;
  102. }
  103. int main()
  104. {
  105. test01();
  106. system("pause");
  107. return EXIT_SUCCESS;
  108. }

行为型模式

10.模板方法模式

定义一个操作中算法的框架,而将一些步骤延迟到子类中。 也就是基类定义了有固定步骤的抽象方法,各派生类实现不同功能

  1. #include<iostream>
  2. using namespace std;
  3. class DrinkTemplate{
  4. public:
  5. //煮水
  6. virtual void BoildWater() = 0;
  7. //冲泡
  8. virtual void Brew() = 0;
  9. //倒入杯中
  10. virtual void PourInCup() = 0;
  11. //加辅助料
  12. virtual void AddSomething() = 0;
  13. //模板方法
  14. void Make(){
  15. BoildWater();
  16. Brew();
  17. PourInCup();
  18. AddSomething();
  19. }
  20. };
  21. //冲泡咖啡
  22. class Coffee : public DrinkTemplate{
  23. public:
  24. virtual void BoildWater(){
  25. cout << "煮山泉水..." << endl;
  26. }
  27. //冲泡
  28. virtual void Brew(){
  29. cout << "冲泡咖啡..." << endl;
  30. }
  31. //倒入杯中
  32. virtual void PourInCup(){
  33. cout << "咖啡倒入杯中..." << endl;
  34. }
  35. //加辅助料
  36. virtual void AddSomething(){
  37. cout << "加糖,加牛奶,加点醋..." << endl;
  38. }
  39. };
  40. //冲泡茶水
  41. class Tea : public DrinkTemplate{
  42. public:
  43. virtual void BoildWater(){
  44. cout << "煮自来水..." << endl;
  45. }
  46. //冲泡
  47. virtual void Brew(){
  48. cout << "冲泡铁观音..." << endl;
  49. }
  50. //倒入杯中
  51. virtual void PourInCup(){
  52. cout << "茶水倒入杯中..." << endl;
  53. }
  54. //加辅助料
  55. virtual void AddSomething(){
  56. cout << "加糖..加柠檬...加生姜..." << endl;
  57. }
  58. };
  59. void test01(){
  60. Tea* tea = new Tea;
  61. tea->Make();
  62. cout << "-----------" << endl;
  63. Coffee* coffee = new Coffee;
  64. coffee->Make();
  65. }
  66. int main(){
  67. test01();
  68. system("pause");
  69. return 0;
  70. }

11.策略模式

  1. #include <iostream>
  2. using namespace std;
  3. //抽象武器 武器策略
  4. class WeaponStrategy{
  5. public:
  6. virtual void UseWeapon() = 0;
  7. };
  8. class Knife : public WeaponStrategy{
  9. public:
  10. virtual void UseWeapon(){
  11. cout << "使用匕首!" << endl;
  12. }
  13. };
  14. class AK47 :public WeaponStrategy{
  15. public:
  16. virtual void UseWeapon(){
  17. cout << "使用AK47!" << endl;
  18. }
  19. };
  20. class Character {
  21. public:
  22. void setWeapon(WeaponStrategy* weapon){
  23. this->pWeapon = weapon;
  24. }
  25. void ThrowWeapon(){
  26. this->pWeapon->UseWeapon();
  27. }
  28. public:
  29. WeaponStrategy* pWeapon;
  30. };
  31. void test01(){
  32. //创建角色
  33. Character* character = new Character;
  34. //武器策略
  35. WeaponStrategy* knife = new Knife;
  36. WeaponStrategy* ak47 = new AK47;
  37. character->setWeapon(knife);
  38. character->ThrowWeapon();
  39. character->setWeapon(ak47);
  40. character->ThrowWeapon();
  41. delete ak47;
  42. delete knife;
  43. delete character;
  44. }
  45. int main(void){
  46. test01();
  47. return 0;
  48. }

12.命令模式

  1. #include <iostream>
  2. #include<queue>
  3. //#include<Windows.h>
  4. using namespace std;
  5. //协议处理类
  6. class HandleClientProtocol{
  7. public:
  8. //处理增加金币
  9. void AddMoney(){
  10. cout << "给玩家增加金币!" << endl;
  11. }
  12. //处理增加钻石
  13. void AddDiamond(){
  14. cout << "给玩家增加钻石!" << endl;
  15. }
  16. //处理玩家装备
  17. void AddEquipment(){
  18. cout << "给玩家穿装备!" << endl;
  19. }
  20. //处理玩家升级
  21. void addLevel(){
  22. cout << "给玩家升级!" << endl;
  23. }
  24. };
  25. //命令接口
  26. class AbstractCommand{
  27. public:
  28. virtual void handle() = 0; //处理客户端请求的接口
  29. };
  30. //处理增加金币请求
  31. class AddMoneyCommand :public AbstractCommand{
  32. public:
  33. AddMoneyCommand(HandleClientProtocol* protocol){
  34. this->pProtocol = protocol;
  35. }
  36. virtual void handle(){
  37. this->pProtocol->AddMoney();
  38. }
  39. public:
  40. HandleClientProtocol* pProtocol;
  41. };
  42. //处理增加钻石的请求
  43. class AddDiamondCommand :public AbstractCommand{
  44. public:
  45. AddDiamondCommand(HandleClientProtocol* protocol){
  46. this->pProtocol = protocol;
  47. }
  48. virtual void handle(){
  49. this->pProtocol->AddDiamond();
  50. }
  51. public:
  52. HandleClientProtocol* pProtocol;
  53. };
  54. //处理玩家穿装备的请求
  55. class AddEquipmentCommand : public AbstractCommand{
  56. public:
  57. AddEquipmentCommand(HandleClientProtocol* protocol){
  58. this->pProtocol = protocol;
  59. }
  60. virtual void handle(){
  61. this->pProtocol->AddEquipment();
  62. }
  63. public:
  64. HandleClientProtocol* pProtocol;
  65. };
  66. //处理玩家升级的请求
  67. class AddLevelCommand : public AbstractCommand{
  68. public:
  69. AddLevelCommand(HandleClientProtocol* protocol){
  70. this->pProtocol = protocol;
  71. }
  72. virtual void handle(){
  73. this->pProtocol->addLevel();
  74. }
  75. public:
  76. HandleClientProtocol* pProtocol;
  77. };
  78. //服务器程序
  79. class Serser{
  80. public:
  81. void addRequest(AbstractCommand* command){
  82. mCommands.push(command);
  83. }
  84. void startHandle(){
  85. while (!mCommands.empty()){
  86. //Sleep(2000);
  87. AbstractCommand* command = mCommands.front();
  88. command->handle();
  89. mCommands.pop();
  90. }
  91. }
  92. public:
  93. queue<AbstractCommand*> mCommands;
  94. };
  95. void test01(){
  96. HandleClientProtocol* protocol = new HandleClientProtocol;
  97. //客户端增加金币的请求
  98. AbstractCommand* addmoney = new AddMoneyCommand(protocol);
  99. //客户端增加钻石的请求
  100. AbstractCommand* adddiamond = new AddDiamondCommand(protocol);
  101. //客户端穿装备的请求
  102. AbstractCommand* addequpment = new AddEquipmentCommand(protocol);
  103. //客户端升级请求
  104. AbstractCommand* addlevel = new AddLevelCommand(protocol);
  105. Serser* server = new Serser;
  106. //将客户端请求加入到处理的队列中
  107. server->addRequest(addmoney);
  108. server->addRequest(adddiamond);
  109. server->addRequest(addequpment);
  110. server->addRequest(addlevel);
  111. //服务器开始处理请求
  112. server->startHandle();
  113. }
  114. int main(void){
  115. test01();
  116. return 0;
  117. }

13.观察者模式

观察者模式是用于建立一种对象与对象之间的依赖关系,一个对象发生改变 时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生改变 的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个 观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除 观察者,使得系统更易于扩展。

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include<list>
  4. using namespace std;
  5. //抽象的英雄 抽象的观察者
  6. class AbstractHero{
  7. public:
  8. virtual void Update() = 0;
  9. };
  10. //具体英雄 具体观察者
  11. class HeroA :public AbstractHero{
  12. public:
  13. HeroA(){
  14. cout << "英雄A正在撸BOSS ..." << endl;
  15. }
  16. virtual void Update(){
  17. cout << "英雄A停止撸,待机状态..." << endl;
  18. }
  19. };
  20. class HeroB :public AbstractHero{
  21. public:
  22. HeroB(){
  23. cout << "英雄B正在撸BOSS ..." << endl;
  24. }
  25. virtual void Update(){
  26. cout << "英雄B停止撸,待机状态..." << endl;
  27. }
  28. };
  29. class HeroC :public AbstractHero{
  30. public:
  31. HeroC(){
  32. cout << "英雄C正在撸BOSS ..." << endl;
  33. }
  34. virtual void Update(){
  35. cout << "英雄C停止撸,待机状态..." << endl;
  36. }
  37. };
  38. class HeroD :public AbstractHero{
  39. public:
  40. HeroD(){
  41. cout << "英雄D正在撸BOSS ..." << endl;
  42. }
  43. virtual void Update(){
  44. cout << "英雄D停止撸,待机状态..." << endl;
  45. }
  46. };
  47. class HeroE :public AbstractHero{
  48. public:
  49. HeroE(){
  50. cout << "英雄E正在撸BOSS ..." << endl;
  51. }
  52. virtual void Update(){
  53. cout << "英雄E停止撸,待机状态..." << endl;
  54. }
  55. };
  56. //观察目标抽象
  57. class AbstractBoss{
  58. public:
  59. //添加观察者
  60. virtual void addHero(AbstractHero* hero) = 0;
  61. //删除观察者
  62. virtual void deleteHero(AbstractHero* hero) = 0;
  63. //通知所有观察者
  64. virtual void notify() = 0;
  65. };
  66. //具体的观察者 BOSSA
  67. class BOSSA : public AbstractBoss{
  68. public:
  69. virtual void addHero(AbstractHero* hero){
  70. pHeroList.push_back(hero);
  71. }
  72. //删除观察者
  73. virtual void deleteHero(AbstractHero* hero){
  74. pHeroList.remove(hero);
  75. }
  76. //通知所有观察者
  77. virtual void notify(){
  78. for (list<AbstractHero*>::iterator it = pHeroList.begin(); it != pHeroList.end();it ++){
  79. (*it)->Update();
  80. }
  81. }
  82. public:
  83. list<AbstractHero*> pHeroList;
  84. };
  85. void test01(){
  86. //创建观察者
  87. AbstractHero* heroA = new HeroA;
  88. AbstractHero* heroB = new HeroB;
  89. AbstractHero* heroC = new HeroC;
  90. AbstractHero* heroD = new HeroD;
  91. AbstractHero* heroE = new HeroE;
  92. //创建观察目标
  93. AbstractBoss* bossA = new BOSSA;
  94. bossA->addHero(heroA);
  95. bossA->addHero(heroB);
  96. bossA->addHero(heroC);
  97. bossA->addHero(heroD);
  98. bossA->addHero(heroE);
  99. cout << "heroC阵亡..." << endl;
  100. bossA->deleteHero(heroC);
  101. cout << "Boss死了...通知其他英雄停止攻击,抢装备..." << endl;
  102. bossA->notify();
  103. }
  104. int main(void){
  105. test01();
  106. return 0;
  107. }