观察者模式(Observer)

观察者模式(Observer)简介:

定义一个一对多的依赖关系,让多个观察者对象监听某个主题对象,当主题对象的状态发生改变时,主题对象则通知所有的观察者对象,做出相应的反应,更新自己的状态等。

观察者模式结构图:

C++代码

Subject抽象类以及ConcreteSubject具体实现类:

//file: Subject.h#pragma once#include "Observer.h"#include <vector>using namespace std;class Subject{public:Subject();virtual ~Subject();void attach(Observer *pObserver);void detach(Observer *pObserver);void notify();virtual int getState() = 0;virtual void setState(int i) = 0;private:vector<Observer *> m_vtObj;};class ConcreteSubject : public Subject{public:ConcreteSubject();virtual ~ConcreteSubject();virtual int getState();virtual void setState(int i);private:int m_State;};
//file: Subject.cpp#include "pch.h"#include "Subject.h"//SubjectSubject::Subject() {}Subject::~Subject() {}void Subject::attach(Observer *pObserver){m_vtObj.push_back(pObserver);}void Subject::detach(Observer *pObserver){for (vector<Observer *>::iterator iter = m_vtObj.begin(); iter != m_vtObj.end(); iter++){if (*iter == pObserver){m_vtObj.erase(iter);return;}}}void Subject::notify(){for (vector<Observer *>::iterator iter = m_vtObj.begin(); iter != m_vtObj.end(); iter++){(*iter)->update(this);}}//ConcreteSubjectConcreteSubject::ConcreteSubject() {}ConcreteSubject::~ConcreteSubject() {}int ConcreteSubject::getState(){return m_State;}void ConcreteSubject::setState(int i){m_State = i;}

Observer抽象类以及ConcreteObserver具体观察者类:

//file: Observer.h#pragma once#include <string>using namespace std;class Subject;class Observer{public:Observer();virtual ~Observer();virtual void update(Subject *ps) = 0;};class ConcreteObserver : public Observer{public:ConcreteObserver(string pName);virtual ~ConcreteObserver();virtual void update(Subject *ps);private:string m_ObjName;int m_ObserverState;};
//file: Observer.cpp#include "pch.h"#include "Subject.h"#include "Observer.h"#include <iostream>using namespace std;//ObserverObserver::Observer() {}Observer::~Observer() {}//ConcreteOberverConcreteObserver::ConcreteObserver(string pName){m_ObjName = pName;}ConcreteObserver::~ConcreteObserver() {}void ConcreteObserver::update(Subject *ps){m_ObserverState = ps->getState();cout << "update observer " << m_ObjName << " to state " << m_ObserverState << " !" << endl;}

客户端代码:

//file: ObserverPattern.cpp : This file contains the 'main' function. Program execution begins and ends there.#include "pch.h"#include "Subject.h"int main(){Subject *sub = new ConcreteSubject();Observer *objA = new ConcreteObserver("A");Observer *objB = new ConcreteObserver("B");sub->attach(objA);sub->attach(objB);sub->setState(101);sub->notify();sub->detach(objB);sub->setState(102);sub->notify();delete sub;delete objA;delete objB;return 0;}

C#代码

观察者模式实现

Subject抽象类以及ConcreteSubject具体实现类:

public abstract class Subject{private List<Observer> objList = new List<Observer>();public int State { get; set; }public void Attach(Observer obj){objList.Add(obj);}public void Detach(Observer obj){objList.Remove(obj);}public void Notify(){foreach (Observer o in objList){o.Update(this);}}}public class ConcreteSubject : Subject{}

Observer抽象类以及ConcreteObserver具体观察者类:

public abstract class Observer{public abstract void Update(Subject sub);}public class ConcreteObserver : Observer{int m_State;string m_Name;public ConcreteObserver(string name){this.m_Name = name;}public override void Update(Subject sub){this.m_State = sub.State;Console.WriteLine("Update Observer {0} to state {1} .", m_Name, m_State);}}

客户端代码:

class Program{static void Main(string[] args){Subject sub = new ConcreteSubject();Observer objA = new ConcreteObserver("A");Observer objB = new ConcreteObserver("B");sub.Attach(objA);sub.Attach(objB);sub.State = 101;sub.Notify();sub.Detach(objB);sub.State = 102;sub.Notify();Console.ReadKey(false);}}

事件委托实现

抽象Subject类以及委托方法原型以及ConcreteSubject具体实现类:

public delegate void EventHander(Subject sub);public abstract class Subject{public int State { get; set; }public abstract void Notify();}public class ConcreteSubject : Subject{public event EventHander Update;public override void Notify(){if (Update != null)Update(this);}}

ConcreteObserverA/B具体实现类:

public class ConcreteObserverA{public int State { get; set; }public string Name { get; set; }public ConcreteObserverA(string name){Name = name;}public void FuncA(Subject sub){this.State = sub.State;Console.WriteLine("Update Observer {0} to state {1} .", Name, State);}public void FeatureA(Subject sub){this.State = sub.State;Console.WriteLine("Update Observer {0} to state {1} .", Name, State);}}public class ConcreteObserverB{public int State { get; set; }public string Name { get; set; }public ConcreteObserverB(string name){Name = name;}public void FuncB(Subject sub){this.State = sub.State;Console.WriteLine("Update Observer {0} to state {1} .", Name, State);}public void FeatureB(Subject sub){this.State = sub.State;Console.WriteLine("Update Observer {0} to state {1} .", Name, State);}}

客户端代码:

class Program{static void Main(string[] args){ConcreteSubject sub = new ConcreteSubject();ConcreteObserverA objA = new ConcreteObserverA("ConcreteObserverA");ConcreteObserverB objB = new ConcreteObserverB("ConcreteObserverB");sub.Update += objA.FuncA;sub.Update += objB.FeatureB;sub.State = 101;sub.Notify();sub.Update -= objB.FeatureB;sub.State = 102;sub.Notify();Console.ReadKey(false);}}

运行实例:

REF

书籍:

设计模式与游戏开发、大话设计模式

GitHub:

https://github.com/me115/design_patterns

转载于:https://www.cnblogs.com/sylvan/p/9064150.html

设计模式——3.观察者模式相关推荐

  1. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

  2. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  3. 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?

    前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...

  4. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  5. 设计模式 C++观察者模式

    无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个 ...

  6. 学习《图说设计模式》观察者模式

    图说设计模式之观察者模式 1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一 ...

  7. 设计模式之观察者模式——猫抓老鼠2

    设计模式之观察者模式--猫抓老鼠2: 对猫抓老鼠1再次进行优化,降低代码复杂性,以及使用事件来对方法进行保护 代码优化: 将老鼠代码进行优化,将自己的方法在构造时便注册到猫里面: using Syst ...

  8. 设计模式之观察者模式——猫抓老鼠1

    设计模式之观察者模式--猫抓老鼠: 问题描述: 通过猫抓老鼠的例子进行了解观察者模式,首先的初始代码为(有三个类): using System;/// <summary> /// 观察者设 ...

  9. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  10. 「设计模式(二) - 观察者模式」

    「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...

最新文章

  1. 数据库备份定期删除程序的开发。
  2. 程序员面试题精选100题(30)-赋值运算符重载函数[C/C++/C#]
  3. protobuf入门教程(三):常用序列化/反序列化接口
  4. nfs linux系统服务,Linux系统服务搭建之NFS
  5. 版本控制工具历史的10个里程碑
  6. CentOS7 使用firewald
  7. 基于三维点云场景的语义及实例分割:RandLA-Net和3D-BoNet
  8. 深度解析HashMap底层实现架构
  9. Java案例:Swing版记事本
  10. css+div导航条样式
  11. android——根据MVC框架设计的结构
  12. C# NPOI(xlsx相关操作)
  13. Go gorilla websocket 小试牛刀
  14. ArcGIS知乎干货教程大集合
  15. Linux内核 之 menuconfig各个选项介绍[转]
  16. 现在PayPal还可以怎样提现???账户只有91刀!
  17. sequelize时间自动格式化
  18. vue脚手架安装步骤详情
  19. 计算机专业进银行和国家电网,银行春招与国家电网那个好?
  20. 数字营销中台和全渠道的数字化精耕,快消老品牌实现数字营销焕新生

热门文章

  1. Linux C 时间函数
  2. bash shell数组模拟队列queue和shell数组使用技巧
  3. Valgrind 使用方法
  4. 让Dock即时自动显示和隐藏程序坞不再延迟
  5. netflix 开源_Netflix的Polynote是一个新的开源框架,可用来构建更好的数据科学笔记本
  6. SQL经典问题1——产品、颜色、数量
  7. 《觉建筑》《斑点狗眼里的世界》首发式
  8. 使用有限状态机(FSM)解释shell 命令
  9. Java字节码反编译工具
  10. python安装缺少api怎么办_请问缺少win32api模块该如何解决?