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 ...
随机推荐
- Log4j_学习_03_自己动手封装log工具
二.参考资料 1.log4j 是否可以通过条件判断 在程序运行中动态选择日志存储目录 2.log4j删除N天前日志实现
- LeetCode OJ:Flatten Binary Tree to Linked List(捋平二叉树)
Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...
- C#中的索引器的简单理解和用法
索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了数组和集合成员时,索引器 ...
- PHP文件管理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- mysql更改数据文件目录及my.ini位置。
需求:更改mysql数据数据文件目录及my.ini位置. 步骤: 1.查找my.ini位置,可通过windows服务所对应mysql启动项,查看其对应属性->可执行文件路径,获取my.ini路径 ...
- TP中登录验证
loginpro 1.建立控制器 loginController.calss.php <?php namespace Admin\Controller; header('Content-type ...
- 【ASP.NET Web API2】利用HttpClient调用Web API(TODO)
参照: 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 纯属记录一下遇到的问题: 我们利用HttpClient来调用自宿主方式寄宿的Web API.HttpCl ...
- ubuntu 挂载exfat
在ubuntu下,由于版权的原因,默认不支持exfat格式的u盘,不过可以很方便就能添加对exfat的支持: 1.对于ubuntu 14.04版本,直接运行下面的命令就可以了: sudo apt-ge ...
- git之reset
有时候,一直用公司电脑开发的时候,顺顺利利.回到家,用自己笔记本,想改改代码,git pull后,发现一堆的unmerged或者其他冲突等问题. 明明只是git pull 一下,怎么会这么多问题. 这 ...
- 洛谷【P1140】相似基因
浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P ...