设计模式--观察者模式示例代码

以你之姓@ 2021-10-30 07:10 361阅读 0赞

观察者模式:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Fsenp3_size_16_color_FFFFFF_t_70

随着交通信号灯的变化,汽车的行为也将随之而变化,一盏交通信号灯可以指挥多辆汽车。

或者说,当我们下课的时候,大家有吃东西,睡觉的,和说话的,当上课铃一响,大家都开始上课听讲,上课铃这个对象的状态从不响到响,使得其他学生对象的状态改变

抽象主题(Subject)角色:主题角色把所有对观察考对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现。

抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。抽象观察者角色一般用一个抽象类或者一个接口实现。在这个示意性的实现中,更新接口只包含一个方法(即Update()方法),这个方法叫做更新方法。

具体主题(ConcreteSubject)角色:将有关状态存入具体现察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者角色(Concrete Observable)。具体主题角色通常用一个具体子类实现。

具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体现察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体现察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。

从具体主题角色指向抽象观察者角色的合成关系,代表具体主题对象可以有任意多个对抽象观察者对象的引用。之所以使用抽象观察者而不是具体观察者,意味着主题对象不需要知道引用了哪些ConcreteObserver类型,而只知道抽象Observer类型。这就使得具体主题对象可以动态地维护一系列的对观察者对象的引用,并在需要的时候调用每一个观察者共有的Update()方法。这种做法叫做”针对抽象编程”。

观察者模式是用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个

代码示例:

三个英雄打boss,boss出现会使玩家攻击,boss死亡会引起玩家停止攻击

代码中:抽象英雄类,具体英雄类,抽象boss类,具体boss类

  1. #include <iostream>
  2. #include <list>
  3. using namespace std;
  4. //抽象的英雄
  5. class AbstractHero {
  6. public:
  7. virtual void Update() = 0;
  8. };
  9. //具体英雄类
  10. class HeroA : public AbstractHero
  11. {
  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. {
  22. public:
  23. HeroB() {
  24. cout << "英雄B正在撸BOSS" << endl;
  25. }
  26. virtual void Update() {
  27. cout << "英雄B停止攻击" << endl;
  28. }
  29. };
  30. class HeroC : public AbstractHero
  31. {
  32. public:
  33. HeroC() {
  34. cout << "英雄C正在撸BOSS" << endl;
  35. }
  36. virtual void Update() {
  37. cout << "英雄C停止攻击" << endl;
  38. }
  39. };
  40. //抽象观察目标类
  41. class AbstractBoss {
  42. public:
  43. virtual void AddHero(AbstractHero* hero) = 0; //添加观察者
  44. virtual void DeleteHero(AbstractHero* hero) = 0; //删除观察者
  45. virtual void Notify() = 0; //通知所有观察者
  46. };
  47. //具体观察目标类
  48. class Boss : public AbstractBoss
  49. {
  50. public:
  51. virtual void AddHero(AbstractHero* hero) {
  52. pHero.push_back(hero);
  53. }
  54. virtual void DeleteHero(AbstractHero* hero) {
  55. pHero.remove(hero);
  56. }
  57. virtual void Notify() {
  58. for (list<AbstractHero*>::iterator it = pHero.begin(); it != pHero.end(); it++)
  59. {
  60. (*it)->Update();
  61. }
  62. }
  63. public:
  64. list<AbstractHero*> pHero;
  65. };
  66. void test()
  67. {
  68. //创建观察者
  69. AbstractHero* heroA = new HeroA;
  70. AbstractHero* heroB = new HeroB;
  71. AbstractHero* heroC = new HeroC;
  72. //创建观察目标
  73. AbstractBoss* boss = new Boss;
  74. //添加观察者
  75. boss->AddHero(heroA);
  76. boss->AddHero(heroB);
  77. boss->AddHero(heroC);
  78. cout << "heroC阵亡。。。" << endl;
  79. boss->DeleteHero(heroC);
  80. cout << "Boss阵亡,通知其他英雄" << endl;
  81. boss->Notify();
  82. delete boss;
  83. delete heroA;
  84. delete heroB;
  85. delete heroC;
  86. }
  87. int main()
  88. {
  89. test();
  90. return 0;
  91. }

发表评论

表情:
评论列表 (有 0 条评论,361人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式-观察模式

    观察者模式也叫订阅发布模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    相关 设计模式:观察模式

    一.简介 > QT的信号槽就是观察者模式,当事件发生之后(比如按钮被点击)就会发出一个信号,这种信号类似广播没有目的.当对象对信号感兴趣,就会通过 connect() 函

    相关 设计模式--观察模式

    定义 在对象之间定义了一对多的依赖,当一方发生改变时,依赖它的对象都会受到通知并自动更新。 其实可以理解为消息发布者(被观察者)与订阅者(观察者),用户可以订阅或者取消