设计模式《十八》——观察者模式

简介

       观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,在主题对象的状态发生变化时,所有依赖于它的对象都得到主题对象的通知并被自动更新。

 

角色与职责

Subject(目标)

  • 目标知道它的观察者。可以有任意多个观察者观察同一个目标;
  • 提供注册和删除观察者对象的接口。

Observer(观察者)

  • 为那些在目标发生改变时需获得通知的对象定义一个更新接口。

ConcreteSubject(具体目标)

  • 将有关状态存入各ConcreteObserver对象;
  • 当它的状态发生改变时,向它的各个观察者发出通知。

ConcreteObserver(具体观察者)

  • 维护一个指向ConcreteSubject对象的引用;
  • 存储有关状态,这些状态应与目标的状态保持一致;
  • 实现Observer的更新接口以使自身状态与目标的状态保持一致。

实现

#include <iostream>
#include <string>
#include <list>
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
using namespace std;
class Secretary;
// 观察者
class PlayerObserver {
public:
    PlayerObserver(Secretary* secretary) :m_secretary(secretary) {}
    void update(string action) {
        cout << "action : " << action << endl;
    }
private:
    Secretary* m_secretary;
};
// 主题对象,被观察者
class Secretary {
public:
    Secretary() {
        m_list.clear();
    }
    void nodify(string action) {
        for (list<PlayerObserver*>::iterator it = m_list.begin(); it != m_list.end(); it++) {
            (*it)->update(action);
        }
    }
    void setPlayerObserver(PlayerObserver* o) {
        m_list.push_back(o);
    }
private:
    list<PlayerObserver*> m_list;
};
int main() {
    Secretary* secretary = NULL;
    PlayerObserver* po1 = NULL;
    PlayerObserver* po2 = NULL;
    secretary = new Secretary;
    po1 = new PlayerObserver(secretary);
    po2 = new PlayerObserver(secretary);
    secretary->setPlayerObserver(po1);
    secretary->setPlayerObserver(po2);
    secretary->nodify("请注意,老板来了");
    secretary->nodify("请放心,老板走了");
    SAFE_DELETE(po1);
    SAFE_DELETE(po2);
    SAFE_DELETE(secretary);
    std::cin.get();
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值