观察者模式

定义:
定义对象间的一种一对多(变化)的的依赖关系,以便当一个对象的状态发生改变是,所有依赖于它的对象都得到通知并自动更新
作用:
1、在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”,当一个目标对象的状态发生改变,所有的依赖对象即观察者都将得到通知。如果这样的依赖关系过于紧密,将使软件不能做到适应业务变化。
2、弱化依赖关系,形成一种稳定的依赖关系。从而达到结构的松耦合。
模型:
1、推模型:把具体的内容相当于广播模式推送给目标对象
2、拉模型:目标对象在通知观察者时,只传递少量的信息。如果观察者需要更具体的信息,由观察者主动到目标对象中获取u,相当于是从观察者从目标对象中拉取数据。
UML结构:

在这里插入图片描述

结构代码:
```c++
#include <iostream>
#include <list>

using namespace std;

class Subject;

class Observer
{
 public:
    Observer(){}
    virtual ~Observer(){}
    virtual void update(Subject *subject) = 0;
    virtual void update(string content) = 0;
};

class Subject
{
 public:
    Subject(){}
    virtual ~Subject(){};
    virtual void setContent(string _content) = 0;
    virtual string getContent() = 0;
    virtual string getAbstractContent() = 0;

    //订阅
    void attach(Observer *observer)
    {
        observers.push_back(observer);
    }

    //取消订阅
    void detach(Observer *observer)
    {
        observers.remove(observer);
    }
    
 protected:
    //通知所有订阅者
    void notifyObservers()
    {
        for(Observer *reader : observers)
        {
            reader->update(this);   //拉模型
        }
    }

    //通知所有订阅者
    void notifyObservers(string _content)
    {
        for(Observer *reader : observers)
        {
            reader->update(_content);   //推模型
        }
    }
    
 private:
    list<Observer *> observers;
};


class Reader : public Observer
{
 public:
    Reader(){}
    ~Reader(){}

    void update(Subject *subject)
    {
        cout << m_username << "订阅的消息内容:" << subject->getContent() << endl;
    }

    //推模型(粒度更大)
    void update(string _content)
    {
        cout << m_username << "订阅的消息内容:" << _content << endl;
    }

    string getUsername()
    {
        return m_username;
    }

    void setUsername(string _username)
    {
        m_username = _username;
    }
 private:
    string m_username;
};


class Push : public Subject
{
 public:
    Push(){}
    ~Push(){}
    
    void setContent(string _content)
    {
        m_content = _content;
        notifyObservers();
    }

    string getContent()
    {
        return m_content;
    }

    string getAbstractContent()
    {
        return "push information!";
    }

  private:
    string m_content;
};
```
观察者扩展:
设置责任链模式,根据等级进行发布通知
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值