head first 设计模式 观察者模式
Head first 设计模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。 让主题与观察者之间松耦合
大话设计模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
设计模式:描述了如何建立这种关系。这一模式中的关键对象是 目标(subject)和观察者(observer)。一个目标可以有任意数目的依赖他的观察者。一旦目标的状态发生改变,所有的观察者都会收到通知。作为对这个通知的相应,每个观察者都将查询目标以使其状态与目标的状态同步。也成为 发布 - 订阅 。
设计原则:为了交互对象之间的松耦合设计而努力
松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的相互依赖降到了最低。

#include "stdafx.h"
#include<iostream>
#include<list>
using namespace std;
/*观察者模式*/
class Subject;
class Obverser
{
public:
Subject* sub;
Obverser(Subject* sb):sub(sb){}
virtual void update(Subject* sb)=;
};
class Subject
{
private:
int result;
public:
list<Obverser*> obverselist;
virtual void registerObserver(Obverser* ob)=;
virtual void removeObserver(Obverser* ob)=;
virtual void notifyObservers()=;
virtual void setResult(int i)
{
result =i;
notifyObservers();
}
virtual int retResult(){return result;}
}; class ConcreteSubject:public Subject
{
public:
virtual void registerObserver(Obverser* ob)
{
obverselist.push_back(ob);
}
virtual void removeObserver(Obverser* ob)
{
list<Obverser*>::iterator it= obverselist.begin();
while(it!=obverselist.end())
{
if(*it == ob)
{
it=obverselist.erase(it);
}else{
it++;
}
}
}
virtual void notifyObservers()
{
for(list<Obverser*>::iterator it=obverselist.begin();it!=obverselist.end();++it)
{
(*it)->update(this);
}
}
}; class concreteObverser1:public Obverser
{
public:
concreteObverser1(Subject* sb):Obverser(sb)
{
sub->registerObserver(this);
}
virtual void update(Subject *sb)
{
cout<<"我是观察者1号,我收到通知了"<<sb->retResult()<<endl;;
}
}; class concreteObverser2:public Obverser
{
public:
concreteObverser2(Subject* sb):Obverser(sb)
{
sub->registerObserver(this);
}
virtual void update(Subject *sb)
{
cout<<"我是观察者2号,我收到通知了"<<sb->retResult()<<endl;
}
}; class concreteObverser3:public Obverser
{
public:
concreteObverser3(Subject* sb):Obverser(sb)
{
sub->registerObserver(this);
}
virtual void update(Subject *sb)
{
cout<<"我是观察者3号,我收到通知了"<<sb->retResult()<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Subject *cs=new ConcreteSubject;
Obverser *cob1 = new concreteObverser1(cs);
Obverser *cob2 = new concreteObverser2(cs);
cs->setResult();
cs->setResult();
Obverser *cob3 = new concreteObverser3(cs);
cs->setResult();
cs->removeObserver(cob2);
cs->setResult();
cs->removeObserver(cob1);
cs->setResult();
return ;
}
head first 设计模式 观察者模式的更多相关文章
- 18. 星际争霸之php设计模式--观察者模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- linkin大话设计模式--观察者模式
linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- js设计模式-观察者模式
定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...
- 【设计模式】Java设计模式 - 观察者模式
[设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...
- [Head First设计模式]山西面馆中的设计模式——观察者模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...
- javascript 设计模式-----观察者模式
观察者模式在设计模式中被重点提到,因为它应用的场景非常多,而且在模块化设计当中扮演着非常重要的角色.MVC模式中最底层的就是观察者模式,当下流行的javascript框架backbone就是很好地运用 ...
- c#设计模式-观察者模式
Observer 与 Subject 互为耦合,但是这种耦合的双方都依赖于抽象,而不依赖于具体. 一.观察者模式 目的 我们都知道解决一个问题有N种解决方式,但在面向对象的设计中如何能做到“高内聚,低 ...
- JAVA 设计模式 观察者模式
用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...
- IOS设计模式-观察者模式
前言:23种软件设计模式中的观察者模式,也是在软件开发中,挺常用的一种设计模式.而在苹果开发中,苹果Cocoa框架已经给我们实现了这个设 计模式,那就是通知和KVO(Key-Value Observi ...
随机推荐
- nginx location配置与rewrite配置
注:原文出处 www.linuxidc.com/Linux/2015-06/119398.htm 1. location正则写法 一个示例: location =/{ # 精确匹配 / ,主机名后面不 ...
- 【剑指offer】删除链表中重复的节点,C++实现(链表)
0.简介 本文是牛客网<剑指offer>笔记. 1.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.例如,链表1-> ...
- STL空间配置器解析和实现
STL空间配置器的强大和借鉴作用不言而喻,查阅资料,发现了Dawn_sf已经对其有了极其深入和详细的描述,所以决定偷下懒借用其内容,只提供自己实现STL空间配置器的源码,具体解析内容参考:(一)STL ...
- BZOJ1999 树网的核[数据加强版]
1999: [Noip2007]Core树网的核 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1214 Solved: 336[Submit][St ...
- Logstash详解之——input模块
原文地址 Logstash由三个组件构造成,分别是input.filter以及output.我们可以吧Logstash三个组件的工作流理解为:input收集数据,filter处理数据,output输出 ...
- LeetCode第二题:Add Two Numbers
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- Spring Boot 集成Swagger2生成RESTful API文档
Swagger2可以在写代码的同时生成对应的RESTful API文档,方便开发人员参考,另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API. 使用Spring Boot可 ...
- 【转】hurry_liu 大神STM32移植contiki入门之一:系统介绍和开发环境搭建
前言: 由于项目的原因,需要在LPC1788(STM32 cortex-M3)上面跑contiki. 之前没有涉及到contiki,不知其为何物.不过这个不是难事,做IT的,每每遇到新事物,都不会处理 ...
- FLASH和EEROM使用【转】
最近在看代码的时候,遇到了一个使用FLASH模拟EEPROM的情况,看到这个我当时是一脸蒙蔽啊,对于一个有时候连FLASH和EEPROM都分不清的人来说,怎么可能读懂用FLASH来模拟EEPROM呢? ...
- js页面埋点
页面埋点的作用,其实就是用于流量分析.而流量的意思,包含了很多:页面浏览数(PV).独立访问者数量(UV).IP.页面停留时间.页面操作时间.页面访问次数.按钮点击次数.文件下载次数等.而流量分析又有 ...