Observer观察者模式
作用:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己

UML图:


Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或者一个借口实现。它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个借口,可以增加和删除观察者对象。

Observer类,抽象观察者,为所有的具体观察者定义一个借口,在得到主题的通知时更新自己。这个借口叫做更新接口。抽象观察者一般用一个抽象类或者一个接口实现。更新接口通常包含一个Update()方法。

ConcreteSubject类,叫做具体主题或具体通知者,将有关状态存入具体通知者对象;在具体主题的内部状态改变时,给所有等级过的观察者发出通知。通常用一个具体子类实现。

ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向一个具体主题对象的引用。

特点:将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。

何时使用:
当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。

代码如下:

Observer.h

 #ifndef _OBSERVER_H_
#define _OBSERVER_H_ #include <string>
#include <list>
using namespace std; class Subject; class Observer
{
public:
~Observer();
virtual void Update(Subject*)=;
protected:
Observer();
private:
}; class ConcreteObserverA : public Observer
{
public:
ConcreteObserverA();
~ConcreteObserverA();
virtual void Update(Subject*);
protected:
private:
string m_state;
}; class ConcreteObserverB : public Observer
{
public:
ConcreteObserverB();
~ConcreteObserverB();
virtual void Update(Subject*);
protected:
private:
string m_state;
}; class Subject
{
public:
~Subject();
virtual void Notify();
virtual void Attach(Observer*);
virtual void Detach(Observer*);
virtual string GetState();
virtual void SetState(string state);
protected:
Subject();
private:
string m_state;
list<Observer*> m_lst;
}; class ConcreteSubjectA : public Subject
{
public:
ConcreteSubjectA();
~ConcreteSubjectA();
protected:
private:
}; class ConcreteSubjectB : public Subject
{
public:
ConcreteSubjectB();
~ConcreteSubjectB();
protected:
private:
}; #endif

Observer.cpp

 #include "Observer.h"
#include <iostream>
#include <algorithm> using namespace std; Observer::Observer()
{} Observer::~Observer()
{} ConcreteObserverA::ConcreteObserverA()
{} ConcreteObserverA::~ConcreteObserverA()
{} void ConcreteObserverA::Update(Subject* pSubject)
{
this->m_state = pSubject->GetState();
cout << "The ConcreteObserverA is " << m_state << std::endl;
} ConcreteObserverB::ConcreteObserverB()
{} ConcreteObserverB::~ConcreteObserverB()
{} void ConcreteObserverB::Update(Subject* pSubject)
{
this->m_state = pSubject->GetState();
cout << "The ConcreteObserverB is " << m_state << std::endl;
} Subject::Subject()
{} Subject::~Subject()
{} void Subject::Attach(Observer* pObserver)
{
this->m_lst.push_back(pObserver);
cout << "Attach an Observer\n";
} void Subject::Detach(Observer* pObserver)
{
list<Observer*>::iterator iter;
iter = find(m_lst.begin(),m_lst.end(),pObserver);
if(iter != m_lst.end())
{
m_lst.erase(iter);
}
cout << "Detach an Observer\n";
} void Subject::Notify()
{
list<Observer*>::iterator iter = this->m_lst.begin();
for(;iter != m_lst.end();iter++)
{
(*iter)->Update(this);
}
} string Subject::GetState()
{
return this->m_state;
} void Subject::SetState(string state)
{
this->m_state = state;
} ConcreteSubjectA::ConcreteSubjectA()
{} ConcreteSubjectA::~ConcreteSubjectA()
{} ConcreteSubjectB::ConcreteSubjectB()
{} ConcreteSubjectB::~ConcreteSubjectB()
{}

main.cpp

#include "Observer.h"
#include <iostream> using namespace std; int main()
{
Observer* p1 = new ConcreteObserverA();
Observer* p2 = new ConcreteObserverB();
Observer* p3 = new ConcreteObserverA(); Subject* pSubject = new ConcreteSubjectA();
pSubject->Attach(p1);
pSubject->Attach(p2);
pSubject->Attach(p3); pSubject->SetState("old"); pSubject->Notify(); cout << "-------------------------------------" << endl;
pSubject->SetState("new"); pSubject->Detach(p3);
pSubject->Notify(); return ;
}

结果如下:

C++设计模式-Observer观察者模式的更多相关文章

  1. [C++设计模式]observer 观察者模式

    有这么一种松耦合的需求: 有一些类的对象对类A对象的状态变化非常感兴趣,不会改变类A的对象,也不会被类A的对象改变,想以一种较小的代价观察对类A对象状态变化. 以下的几种方式也能实现上述目的 (1)通 ...

  2. Java 设计模式 – Observer 观察者模式

    目录 [隐藏] 1 代码 1.1 观察者接口: 1.2 被观察者: 1.3 观众类 : 1.4 电影类: 1.5 效果如下: 代码 说明都在注释: 观察者接口: package ObserverMod ...

  3. 委托、事件、Observer观察者模式的使用解析二

    一.设计模式-Observer观察者模式 Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新.Observer模式是一种 ...

  4. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  5. 设计模式之观察者模式(Observable与Observer)

    设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...

  6. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

  7. 设计模式18:Observer 观察者模式(行为型模式)

    Observer 观察者模式(行为型模式) 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象) ...

  8. java设计模式解析(1) Observer观察者模式

      设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析( ...

  9. java设计模式之观察者模式

    观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...

随机推荐

  1. study java language

    2016.11.30 1).About the Java Technology 2).The Java Language Environment: Contents

  2. php 获取静态方法调用的类名

    方法一: class foo { static public function test() { var_dump(get_called_class()); } } class bar extends ...

  3. 关于自定义Dialog的一次折腾

    <新手,自己的简单理解,勿喷,有更好建议欢迎提出>   1.在设置dialog布局上的时候 我需要做一个圆角的dialog,我像往常一样定义一个<shape>然后做为我的dia ...

  4. 1.4 云计算的SPI服务模型

    云计算是通过共享资源池的方式来提高资源利用率的.在云计算中,根据其资源池中资源的类别,可以把云计算的服务模型分为三种,即所谓的SPI 模型   应用程序 Software as a Service ( ...

  5. Python 中的虚拟环境

    检查系统是否安装了virtualenv: $ virtualenv --version 创建虚拟环境venv(名字可以随便取,一般为venv): $ virtualenv venv 使用虚拟环境ven ...

  6. music player界面

    public class SoundPlayerGUI extends JFrame implements ChangeListener, ActionListener { private stati ...

  7. JavaScript常用对象的方法和属性

    ---恢复内容开始--- 本文将简单介绍JavaScript中一些常用对象的属性和方法,以及几个有用的系统函数. 一.串方法 JavaScript有强大的串处理功能,有了这些串方法,才能编写出丰富多彩 ...

  8. python之环境搭建windows版

    1.先到python官网下载属于自己的的python版本,有linux版,有mac版,有windows版:https://www.python.org/downloads/windows/ 2.下载完 ...

  9. Opencv-Python 学习

    加载一个灰度图,显示图片,按下’s’键保存后退出,或者按下 ESC 键退出不保存. import numpy as np import cv2 img = cv2.imread('linux.png' ...

  10. unity官方换装教程Character Customization 学习笔记

    1. 下载示例demo,可以直接从AssetsStore上下载,但是速度比较慢,我在github上找了一个据说支持unity5.x的. 链接:https://github.com/spacebeagl ...