小言_互联网的博客

常用设计模式-观察者模式

329人阅读  评论(0)

         观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)

        当观察者观察到事件到来之后,通知对该事件感兴趣的监听者进行相应的操作

        抽象主题/抽象被观察者(Subject):将所有观察者对象保存在一个集合中,可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象
        具体主题/具体被观察者(ConcreteSubject):该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知
        抽象观察者(Observer):它定义了一个更新接口,使得在得到主题/被观察者更新时通知自己
        具体观察者(ConcrereObserver):实现抽象观察者定义的更新接口,以便在得到主题/被观察者更新时通知自己更新自身状态


  
  1. //抽象Observer-抽象英雄
  2. class AbstractHero {
  3. public:
  4. virtual void updata() = 0;
  5. };
  6. //具体Observer-具体英雄A
  7. class HeroA: public AbstractHero {
  8. public:
  9. HeroA() {
  10. cout << "英雄A开始打Boss-------" << endl;
  11. }
  12. virtual void updata() {
  13. cout << "英雄A捡装备" << endl;
  14. }
  15. };
  16. //具体Observer-具体英雄B
  17. class HeroB : public AbstractHero {
  18. public:
  19. HeroB() {
  20. cout << "英雄B开始打Boss-------" << endl;
  21. }
  22. virtual void updata() {
  23. cout << "英雄B捡装备" << endl;
  24. }
  25. };
  26. //具体Observer-具体英雄C
  27. class HeroC : public AbstractHero {
  28. public:
  29. HeroC() {
  30. cout << "英雄C开始打Boss-------" << endl;
  31. }
  32. virtual void updata() {
  33. cout << "英雄C捡装备" << endl;
  34. }
  35. };
  36. //Observer目标-抽象Boss
  37. class AbstractBoss {
  38. public:
  39. //添加观察者
  40. virtual void addHero(AbstractHero* hero) = 0;
  41. //删除观察者
  42. virtual void deleteHero(AbstractHero* hero) = 0;
  43. //通知所有观察者
  44. virtual void notifyHero() = 0;
  45. };
  46. //具体观察者对象-具体BossA
  47. class BossA: public AbstractBoss{
  48. public:
  49. //添加观察者
  50. virtual void addHero(AbstractHero* hero) {
  51. pHeroList.push_back(hero);
  52. }
  53. //删除观察者
  54. virtual void deleteHero(AbstractHero* hero) {
  55. pHeroList. remove(hero);
  56. }
  57. //通知所有观察者
  58. virtual void notifyHero() {
  59. for (auto &it :pHeroList) {
  60. it->updata();
  61. }
  62. }
  63. public:
  64. list<AbstractHero*> pHeroList;
  65. };
  66. //Invoker
  67. void test() {
  68. //创建观察者
  69. AbstractHero* heroA = new HeroA;
  70. AbstractHero* heroB = new HeroB;
  71. AbstractHero* heroC = new HeroC;
  72. //创建观察目标
  73. AbstractBoss* bossA = new BossA;
  74. bossA->addHero(heroA);
  75. bossA->addHero(heroB);
  76. bossA->addHero(heroC);
  77. cout << "英雄C阵亡"<<endl;
  78. bossA->deleteHero(heroC);
  79. cout << "BossA死亡,通知未死亡英雄,捡装备" << endl;
  80. bossA->notifyHero();
  81. }

        优点:观察者和被观察者是抽象耦合的;建立了一套触发机制
        缺点:
                1.如果一个观察目标有很多观察者的话,将所有的观察者都通知到会花费很多时间
                2.如果观察者和观察目标间有循环依赖,观察目标会触发它们之间进行循环调用,可能导致系统崩溃
                3.观察者模式没有相应的机制让观察者知道观察目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化


转载:https://blog.csdn.net/weixin_44840658/article/details/128527186
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场