设计模式——观察者模式
来源:互联网 发布:excel数据分析函数 编辑:程序博客网 时间:2024/06/06 03:35
一、定义
观察者模式是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。主要解决的问题是,在一个一对多的依赖关系中,当"一"变化的时候,依赖这个"一"的多也能够同步发生改变。
1. 优点
1)观察者和被观察者是抽象耦合的;
2)建立一套触发机制。
2.缺点
1)如果一个被观察者对象有很多的直接和间接的观察者,将所有的观察者都通知到会花费很多时间;
2)如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃;
3)观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
3.示例
#include <iostream>#include <list>#include <string> using ::std::list;using ::std::string; class Observer{public: Observer() {} virtual ~Observer() {} virtual void update() {}}; class Subject{public: Subject(){} virtual ~Subject() {} void attach(Observer *observer) { m_observers.push_back(observer); } void remove(Observer* observer) { m_observers.remove(observer); } void notify() { list<Observer*>::iterator iter = m_observers.begin(); for(;iter != m_observers.end(); iter++) (*iter)->update(); } virtual void setStatus(string s) { m_status = s; } virtual std::string getStatus() { return m_status; }private: list<Observer* > m_observers;protected: std::string m_status;}; class ClassSubject: public Subject{public: ClassSubject(string name):m_name(name) {} ~ClassSubject() {} void setStatus(string s) { m_status = s ; } string getStatus() { return m_status; }private: string m_name;}; class ClassObserver : public Observer{public: ClassObserver (string name,Subject *subject):m_name(name),m_subject(subject) { } ~ClassObserver () {} void update() { std::string status = m_subject->getStatus(); cout << m_name <<"-------" << status <<endl; }private: std::string m_name; Subject *m_subject;};
#include "observer.h"int main(){ Subject *subject = new ClassSubject("huamoxian"); Observer *observer = new ClassObserver("hello",subject); subject ->attach(observer); subject ->setStatus("说话!"); subject ->notify(); system("pause"); delete subject ; delete observer; return 0;}
阅读全文
0 0
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者
- 设计模式——观察者设计模式
- 设计模式——观察者
- 设计模式——观察者
- 设计模式 —— 观察者
- 设计模式——观察者
- 【设计模式】——观察者
- 设计模式——观察者模式
- 每日设计模式——观察者模式
- 02-升级jdk9后eclipse无法启动的解决方法
- 实训第一天
- BZOJ2525: [Poi2011]Dynamite
- 1045. 快速排序(25) PAT乙级真题
- [POJ](1631)Bridging signals ---- LIS+O(nlogn)优化(二分)
- 设计模式——观察者模式
- 用C++编写递归函数GetPower(int x,int y)计算x的y次幂,在同一程序里中针对整型和实型实现两个重载的函数;在主程序中实现输入输出
- 3486. 【NOIP2013模拟联考10】道路改建(rebuild)(2017.12A组)(tarjan缩环+拓补排序+DP+bitset)
- 图解设计模式
- 加速神经网络训练方法-Adam公式
- JAVA 构造方法 静态变量 静态方法
- js-----二级菜单联动
- 【学习C++】Map使用
- Surf算法