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 ...
随机推荐
- Mybatis_总结_06_用_插件开发
一.前言 Mybatis采用责任链模式,通过动态代理组织多个插件(拦截器),通过这些插件可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的 ...
- 如何选择MySQL数据库的安装方式
MySQL数据库安装有yum安装,rpm安装,二进制编译安装,cmake,或者make安装,但是选择什么样的安装方式则全看实际应用场景. 下为网友总结安装方式选择: 若是对数据库要求不太高的场景 ...
- CodeForces 589H Tourist Guide
传送门 题目大意 给定$n$个点$m$条边的无向图,有$K$个关键点,你要尽可能的让这些关键点两两匹配,使得所有点对之间可以通过简单路径连接且任意两个简单路径没有重复的边(可以是共同经过一个点),输出 ...
- CodeForces - 156C:Cipher (不错的DP)
Sherlock Holmes found a mysterious correspondence of two VIPs and made up his mind to read it. But t ...
- 利用python进行数据分析—数据清洗记录3,map,apply,
社会心态调查报告 导语: 时代决定心态,心态映照时代.社会心态产生于社会个体心理,又以整体的形态存在,进而影响着每个社会成员的社会价值取向和行为方式,影响着国家经济政治和社会发展大局.良好的社会心 ...
- 利用PIL添加水印
转:http://www.jb51.net/article/66542.htm
- ugui在运行时改变RectTransform的大小
http://blog.csdn.net/BeiFuDeNvWang/article/details/50838266 在代码中动态改变RectTransform大小的方法如下所示: 1:直接对siz ...
- Day2-Python基础2---字符串操作
一.字符串操作 特性:不可修改 name = "my \tname is {name} and i am {year} old" #首字母大写.capitalize print(n ...
- eclipse下不能编译.ftl文件,会报错的解决方法
先安装一个插件 右击ftl文件,选择open with 但是没有freeMarker这个选项,如果有直接打开,如果没有则需要下载相关插件. 要安装一个freemarker的插件,才可以编辑FTL文件, ...
- Java-API:un-java.text.DecimalFormat
ylbtech-Java-API:java.text.DecimalFormat 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 0. https://docs. ...