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 ...
随机推荐
- GCD多线程的使用
转载自http://blog.csdn.net/nono_love_lilith/article/details/7829557 写得非常好 1.下面来看下如何使用gcd编程的异步 dispatch_ ...
- Java实现LSH(Locality Sensitive Hash )
在对大批量数据进行图像处理的时候,比如说我提取SIFT特征,数据集为10W张图片,一个SIFT特征点是128维,一张图片提取出500个特征点,这样我们在处理的时候就是对5000万个128维的数据进行处 ...
- GC(Garbage Collection)垃圾回收机制
1.在垃圾回收器中,程序员没有执行权,只有通知它的权利. 2.程序员可以通过System.gc().通知GC运行,但是Java规范并不能保证立刻运行. 3.finalize()方法,是java提供给程 ...
- loopqueue
import java.util.Arrays; public class loopQueue <E>{ public Object[] data=null; private int ma ...
- http请求在asp.net中的请求过程
当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,ASPNET_ISAPI.dll会 ...
- bootstrap-table 父子表入门篇
官方文档:http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/#多语言 一.引入js.css <!-- 引入bootstrap ...
- Day2-VIM(三):删除
字符删除 x 删除光标所在处字符 X 删除光标所在前字符 这里没有什么可注意的地方,但需要说明一下的是 通常情况下,新手一旦着急便会按着x不动,从而达到删除一大块文本的目的 如果是头几天使用还好说,但 ...
- 关于移动端的一些tip
移动端的一些tip 开发相关 关于viewport <meta name="viewport" content="name=value,name=value&quo ...
- java代码继承基础
总结:继承是java编程的核心,我搞不明白,子类对象调用父类的成员方法时.父类的带参构造方法有什么用,还赋值了 package com.bc; //普通类 public class yt { publ ...
- pycharm中 unittests in xxxx 运行模式
pycham中 当你运行时 ,使用的 是 Run "unittests in xxxx" 模式时候,if __name__ == '__main__': 后面的代码是不执行的 ...