设计模式——观察者模式的双解耦实现 .

本文深入探讨了观察者模式的概念、实现原理及其在实际应用中的价值。通过具体代码示例,展示了如何利用抽象类定义观察者和主题,实现主题对象与观察者之间的解耦,以及如何在状态变化时通知所有观察者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

什么是观察者模式?观察者模式通俗的理解就是多个对象(观察者)“实时”观察某个对象(主题对象)。一旦这个被观察的对象状态发生了变化或者产生了某种事件,就会依次通知所有正在观察该对象的观察者,让他们能主动且及时应对状态(或事件)的发生。

1)观察者要想得主题对象的通知,必须在主题对象那里登记——添加观察者

2)观察者不想继续得到主题对象的通知的时候,主题对象应该将其从自己的登记表中去除——删除观察者

3)主题对象一般需要一个动态的容器作为登记表记录多个观察者,容器一般可以是vector、list。map等。

4)当主题对象的状态发生变化的时候要做的就是遍历该容器,“通知”容器中所有观察者(即调用某个观察者的事件处理函数)。

UML图


 

标题中的双解耦,其实就是定义了抽象的观察者Observer和抽象的主题Subject。然后让具体的观察者和具体的主题继承抽象接口。这样做的好处有两点:

1)抽象的Observert可以继承很多不同类的观察者,如观察者一想要得到“何时吃饭”的通知,观察者二想要得到“何时考试”通知

2)抽象的Subject可以继承不同类的主题(即通知者),如通知者是“妈妈”或者通知者是“老师”。

代码:

  1. class Observer  
  2. {  
  3.     protected:  
  4.     Subject &subject;  
  5.     public:  
  6.     Observer(Subject &sub):subject(sub){}  
  7.     virtual void action()=0;  
  8. };  
  9. class son:public Observer  
  10. {  
  11.     public:  
  12.     son(Subject &sub):Observer(&sub){}  
  13.     void action()  
  14.     {  
  15.         cout<<sub.GetState()<<",回家吃饭了\n";  
  16.     }  
  17. }  
  18. class Subject  
  19. {  
  20.    public:  
  21.    virtual void Add(Observer &observer)=0;//定义抽象添加函数   
  22.    virtual void Delete(Observer &observer)=0;//定义抽象删除函数   
  23.    void Notify()=0;//定义抽象通知消息函数   
  24.    char* GetState()=0;//获取主题对象的状态   
  25. };  
  26. class Monther:public Subject  
  27. {  
  28.     vector<Observer&> observers;//存放观察者的容器   
  29.   
  30.     public:  
  31.     void Add(Observer &obs)  
  32.     {  
  33.         observers.push_back(obs);//添加一个观察者   
  34.     }  
  35.     void Delete(Observer &obs)  
  36.     {  
  37.         observers.pop_back(obs);//删除一个观察者   
  38.     }  
  39.     void Notify()  
  40.     {  
  41.         iterator vector<Observer&> it;  
  42.         for(it=observers.begin();it!=observers.end();++it)  
  43.         {  
  44.             it->action();//遍历通知所有观察者   
  45.         }  
  46.     }  
  47.     char* GetState()  
  48.     {  
  49.         return "我是妈妈";  
  50.     }  
  51. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值