设计模式之后:观察者模式知识点整理

1、什么是观察者模式?

观察者模式定义一系列对象之间的一对多关系,当一个对象改变、更新状态时,依赖它的都会收到通知改变或者更新。

观察者模式是一种行为型模式。

2、为什么需要观察者模式?

从定义中我们可以知道观察者模式当对象改变时,其他依赖的对象都会收到改变信息的状态。

从本例分析项目经理想知道进度情况,他只需要绑定进度,他就可以知道进度信息了,而无需关心如何操作,如果再增加一个想知道进度信息老板呢?也很容易,也让老板绑定进度信息数据就好了,不想知道的时候就解除绑定,就不在获取进度信息了。

所以在本案例场景中,观察者是我们这个场景非常合适的设计。

3、如何实现观察者模式?

自定义观察者模式

实现如下

我们先来看一下这个UML类图进行分析

4.优点与缺点 

观察者模式优点:
观察者和被观察者是抽象耦合的
察者模式实现了动态联动
观察者模式支持广播通信
观察者模式缺点:
如一个主题被大量观察者注册,则通知所有观察者会花费较高代价
如果某些观察者的响应方法被阻塞,整个通知过程即被阻塞,其它观察者不能及时被通知

demo:

#include  <iostream>
#include  <vector>
#include  <string>
using namespace std;
class Secretary;
class Obersever{
public:
    Obersever(string name,Secretary* secretary):m_name(name),m_secretary(secretary){}
    void uptate(string action){
       cout<<"observer:"<<m_name<<",receive action:"<<action<<endl;
    }
private:
    string  m_name;
    Secretary* m_secretary;

};
//notify

class Secretary{
public:
    void addobserver(Obersever *o){
        v.push_back(o);
    }
    void Notify(string action)
    {
        for(vector<Obersever*>::iterator it=v.begin();it!=v.end();it++){
            (*it)->uptate(action);
        }
    }
    void setaction(string action)
    {
        m_action=action;
        Notify(m_action);
    }
private:
    string m_action;
    vector<Obersever*> v;
};
int main()
{
  //
  Secretary * s1=new Secretary;
  //notify object
  Obersever *po1=new Obersever("zhong",s1);
  s1->addobserver(po1);
  Obersever *po2=new Obersever("xian",s1);
  s1->addobserver(po2);
  s1->setaction("boss is coming");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值