首页 > 其他分享 >观察者模式

观察者模式

时间:2023-09-13 14:33:38浏览次数:38  
标签:status sub int void list 观察者 模式 Observe

观察者模式,也称发布订阅模式,主题方发布,观察方订阅。

observe.h

/*
 *
 * Copyright (C) 2023-09-13 14:06 zxinlog <[email protected]>
 *
 */
#include <func.h>

#include <iostream>
#include <list>
using std::cout;
using std::endl;
using std::list;

class Observe {
public:
    virtual void update(int status) = 0;
};

class Subject {
public:
    virtual void attach(Observe *obs) = 0;
    virtual void detach(Observe *obs) = 0;
    virtual void notify() = 0;
    virtual void setStatus(int status) = 0;
    virtual int getStatus() = 0;
};

class ConcretSubject : public Subject {
public:
    void attach(Observe *obs);
    void detach(Observe *obs);
    void notify();
    void setStatus(int status);
    int getStatus();

private:
    list<Observe *> _list;
    int _status;
};

class ObserveA : public Observe {
    void update(int status);
};

class ObserveB : public Observe {
    void update(int status);
};

class ObserveC : public Observe {
    void update(int status);
};

observe.cc

/*
 *
 * Copyright (C) 2023-09-13 14:11 zxinlog <[email protected]>
 *
 */
#include <func.h>

#include <iostream>
#include <memory>

#include "observe.h"
using std::cout;
using std::endl;
using std::shared_ptr;

void ConcretSubject::attach(Observe *obs) {
    _list.push_back(obs);
}

void ConcretSubject::detach(Observe *obs) {
    for (auto i = _list.begin(); i != _list.end(); i++) {
        if (*i == obs) {
            _list.remove(obs);
            return;
        }
    }
}

void ConcretSubject::notify() {
    for (std::list<Observe *>::iterator i = _list.begin(); i != _list.end(); i++) {
        (*i)->update(_status);
    }
}

void ConcretSubject::setStatus(int status) {
    _status = status;
}

int ConcretSubject::getStatus() {
    return _status;
}

void ObserveA::update(int status) {
    cout << "Observe-A"
         << " observe status is " << status << endl;
}
void ObserveB::update(int status) {
    cout << "Observe-B"
         << " observe status is " << status << endl;
}

void ObserveC::update(int status) {
    cout << "Observe-C"
         << " observe status is " << status << endl;
}

// test
int main() {
    shared_ptr<Subject> sub(new ConcretSubject());
    shared_ptr<Observe> obA(new ObserveA());
    shared_ptr<Observe> obB(new ObserveB());
    shared_ptr<Observe> obC(new ObserveC());

    sub->setStatus(1);
    sub->attach(obA.get());
    sub->attach(obB.get());
    sub->attach(obC.get());
    sub->notify();

    sub->detach(obB.get());
    sub->setStatus(3);
    sub->notify();
}

使用list存储观察者队列信息。
使用attach添加观察者
使用detach删除观察者
使用notify通知观察者更新。

标签:status,sub,int,void,list,观察者,模式,Observe
From: https://www.cnblogs.com/zxinlog/p/17699616.html

相关文章

  • 03-开发环境介绍_交互模式的使用_IDLE介绍和使用
       ......
  • 两个numpy技巧(模式识别总结)
    1.查找符合特定条件的Numpyndarray对象中元素的数量np.count_nonzero()函数可以用来完成此操作。以下是使用np.count_nonzero()函数快速查找数组中小于5的元素数量的示例:count=np.count_nonzero(array<5)在此示例中,我们使用array<5来获取array中小于5的所有元素,然后......
  • 设计模式-门面模式
    门面模式(文章目录)1、什么是门面模式  门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。注意这里针对的是接口。  这个定义很简洁,我再进一步解释一下。  假设有一个系统A,提供了a、b、c、d四个接口。系统B完成某个业务功能,需要调用A系统的......
  • Oauth2.0授权码模式
    参考:https://blog.csdn.net/qq15035899256/article/details/129541483授权码模式这种模式是最安全的一种模式,也是推荐使用的一种,比如我们手机上的很多App都是使用的这种模式。相比隐式授权模式,它并不会直接返回Token,而是返回授权码,真正的Token是通过应用服务器访问验证服......
  • UI 自动化测试框架:PO 模式+数据驱动
    1.PO设计模式简介什么是PO模式?PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个Page类,并以页面为单位来写测试用例,实现页面对象和测试用例的分离。PO模式的设计思想与面向对象相似,能让测试代码变得可读性更好,可维护性高,复用性高。PO模......
  • 6. 前端设计模式之观察者模式
    使用观察者模式,我们可以将某些对象(观察者)订阅到另一个对象(可观察对象)。当一个事件发生时,可观察对象会通知它的所有观察者!这个模式出境的概率就比较高了,无论是在前端还是后端,都能见到它的身影,特别跟事件有关的场景。从定义看这个模式涉及到两种对象,一种可观察对象也就是观察的......
  • 单例模式的五种实现方式
    参考https://blog.csdn.net/qq_42372017/article/details/1211924451.单例模式的四大原则构造方法私有以静态方法或者枚举返回实例多线程环境下都是访问同一个实例反序列化时不会重新构建对象2.单例模式通常有5种实现方法2-1饿汉模式饿汉模式会在类初始化时就提前......
  • 设计模式-装饰器模式
    装饰器模式(文章目录)什么是装饰器模式  装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。为什么使用装饰器模式使用装饰者模式有如下好处:  1.避免了类爆炸问题,简化了设计  2.易于扩展,可以灵活组......
  • Android开发中常见的设计模式
    Android开发中常见的设计模式对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次。而在android开发中,必要的了解一些设计模式又是非常有必要的。对于想系统的学习设计模式的同学,这里推荐2本书。一本是HeadFirst系列的HeadH......
  • Padavan配置白名单模式及上网时间控制
    登录Padavan管理后台,高级设置--->防火墙--->mac访问控制--->mac访问控制模式【允许模式---仅列表中的设备可获取网络;拒绝模式---列表中的设备拒绝访问网络】,禁止访问路由器主机这项一定打开,不然试了下没效果,开了就是未在列表中的设备不能访问路由器,初次连接的设备也无法获取ip地......