首页 > 其他分享 >设计模式--观察者模式(Observer Pattern)

设计模式--观察者模式(Observer Pattern)

时间:2023-12-03 12:11:48浏览次数:27  
标签:Observer Subject -- void 观察者 对象 设计模式 subject

Observer模式

观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。

观察者模式主要包含以下几个角色:

  1. Subject(主题):也被称为Observable,它是被观察的对象。当它的状态发生改变时,会通知所有的观察者。
  2. Observer(观察者):它是观察Subject的对象,当Subject的状态发生改变时,会收到通知。

观察者模式的主要优点是:

  • 支持简单的广播通信:Subject发生改变时,所有注册的Observer都会收到通知。
  • 低耦合:Subject和Observer可以独立修改,只要不改变他们之间的通信方式。

观察者模式适用于以下场景:

  • 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,你不希望这些对象是紧密耦合的。

以下是一个简单的C++实现的观察者模式(Observer Pattern)示例:

#include <iostream>
#include <list>

// 前向声明
class Observer;

// 主题
class Subject {
public:
    void attach(Observer* observer) {
        observers_.push_back(observer);
    }
    void detach(Observer* observer) {
        observers_.remove(observer);
    }
    void notify();

private:
    std::list<Observer*> observers_;
};

// 观察者
class Observer {
public:
    Observer(Subject* subject) : subject_(subject) {
        subject_->attach(this);
    }
    virtual void update() = 0;

protected:
    Subject* subject_;
};

void Subject::notify() {
    for (Observer* observer : observers_) {
        observer->update();
    }
}

// 具体观察者A
class ConcreteObserverA : public Observer {
public:
    ConcreteObserverA(Subject* subject) : Observer(subject) {}
    void update() override {
        std::cout << "Concrete Observer A is updated." << std::endl;
    }
};

// 具体观察者B
class ConcreteObserverB : public Observer {
public:
    ConcreteObserverB(Subject* subject) : Observer(subject) {}
    void update() override {
        std::cout << "Concrete Observer B is updated." << std::endl;
    }
};

int main() {
    Subject subject;

    ConcreteObserverA observerA(&subject);
    ConcreteObserverB observerB(&subject);

    subject.notify();

    return 0;
}

在这个例子中,Subject是主题,它维护了一个观察者列表。当主题的状态发生改变时,它会调用notify方法通知所有的观察者。
Observer是观察者,它定义了一个update接口。ConcreteObserverA和ConcreteObserverB是具体的观察者,它们实现了update接口。
通过这种方式,我们可以实现当主题的状态发生改变时,所有观察者都会得到通知并自动更新。

标签:Observer,Subject,--,void,观察者,对象,设计模式,subject
From: https://www.cnblogs.com/lanyangsh/p/17872788.html

相关文章

  • CodeForces 1526F Median Queries
    洛谷传送门CF传送门首先,如果我们确定了\(1,2\)或\(n-1,n\)的位置,我们就能求出原排列。因为题目给了\(p_1<p_2\),所以可以不考虑对称性。也就是说我们知道两个位置是\(1,2\)或\(n-1,n\)但不确定究竟是\(1,2\)还是\(n-1,n\)也可以。然后,如果我们确定......
  • 注释
    注释书写注释是一个非常好的习惯。平时写代码一定要注意规范注释分为:1.单行注释2.多行注释3.文档注释方法:单行注释:(//)多行注释:(/*回车)文档注释:(/**回车)文档注释分为:1.类注释:在类之上2.方法注释:在方法之上文档注释有下列参数:@author 作者名 @ver......
  • 2023-2024-1 20231417 《计算机基础与程序设计》第十周学习总结
    2023-2024-120231417《计算机基础与程序设计》第十周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十周作业这个作业的目标自学计算机科学概论第12,13,14章,《C语言程序设计》第9章......
  • const与指针的组合
    ① constint*p;//指向一个整型常量的指针,p可变,p指向的对象不可变。② intconst*p;//同上。③ int*constp;//p不可变,p指向的对象可变(const修饰的是*),常量指针。④ constint*constp;//p不可变,p指向的对象也不可变。关键点:以*为界,*号左边修饰的是p指向的对象,*号......
  • ucup nanjing 题解
    比赛链接D收获很大的一道题首先考虑朴素的\(dp\),令\(f_{x,i}\)为\(x\)子树中的每一个叶子到\(x\)的距离都为\(i\)的最小代价不难列出\(dp\)式子为:\(f_{x,i}=\min\limits_{i\in\{0,1\}}\{cost(u,i)+\sum\limits_{v\inson(u)}f_{v,x-i}\}\),其中\(cost(u,i)\)为把......
  • matlab如何保存figure中去掉白边的图片
    ​输出图片成可直接调入的灰度图,设置输出图片空白边距,以及调整图片大小,纵横比。一、先显示图片,imshow。如果是plot,或者newplot,直接看“三”。imshow(strain_image,'border','tight','initialmagnification','fit');%'border','tight'的组合功能意思是去掉图像周边空白%'In......
  • 数据类型
    数据类型数据类型:强类型语言+弱类型语言强类型语言:要求变量的使用严格符合规定,所有变量都必须先定义后才能使用 Java的数据类型分为基本数据类型和引用数据类型八大基本数据类型:整型byte[1],short[2],int[4],long[8]浮点型float[4],double[8]字符型ch......
  • 堆排序
    目录1.基本原理2.例子3.代码实现本文主要介绍堆排序的原理、例子以及代码实现。1.基本原理堆排序(HeapSort)是一种基于比较的排序算法,它的工作原理是首先将待排序的序列构造成一个大顶堆或小顶堆,然后交换堆顶元素和最后一个元素,然后将剩余元素重新调整为大顶堆或小顶堆,再交换堆......
  • 06.常用模拟器使用
    1.emulator介绍AndroidStudio自带模拟器功能齐全步骤:1.安装jdk及配置环境变量官网:https://www.oracle.com/java/technologies/downloads/链接:https://pan.baidu.com/s/12HA0ih7GsHBgBD7JmG_WZw提取码:oya4安装完毕后需要配置环境变量新建变量JAVA_HOME:jdk......
  • matplotlib报错:AttributeError: module 'backend_interagg' has no attribute 'Figure
    使用本地python环境可以成功执行importpandasaspdimportmatplotlib.pyplotasplt#设置字体plt.rcParams['font.sans-serif']=['SimHei']#能正确显示负号plt.rcParams['axes.unicode_minus']=False#设置画布大小plt.figure(figsize=(11,8))#柱状图pat......