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 设计模式 观察者模式的更多相关文章

  1. 18. 星际争霸之php设计模式--观察者模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. linkin大话设计模式--观察者模式

    linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...

  3. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  4. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

  5. 【设计模式】Java设计模式 - 观察者模式

    [设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...

  6. [Head First设计模式]山西面馆中的设计模式——观察者模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...

  7. javascript 设计模式-----观察者模式

    观察者模式在设计模式中被重点提到,因为它应用的场景非常多,而且在模块化设计当中扮演着非常重要的角色.MVC模式中最底层的就是观察者模式,当下流行的javascript框架backbone就是很好地运用 ...

  8. c#设计模式-观察者模式

    Observer 与 Subject 互为耦合,但是这种耦合的双方都依赖于抽象,而不依赖于具体. 一.观察者模式 目的 我们都知道解决一个问题有N种解决方式,但在面向对象的设计中如何能做到“高内聚,低 ...

  9. JAVA 设计模式 观察者模式

    用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...

  10. IOS设计模式-观察者模式

    前言:23种软件设计模式中的观察者模式,也是在软件开发中,挺常用的一种设计模式.而在苹果开发中,苹果Cocoa框架已经给我们实现了这个设 计模式,那就是通知和KVO(Key-Value Observi ...

随机推荐

  1. MySQL for Mac在Mac终端导入导出.sql文件

    https://www.cnblogs.com/code4app/p/6222310.html 1.导入 打开终端输入:(前提是已经配置过MySQL环境变量) mysql -u root -p cre ...

  2. Linux-监控与安全运维之Nagios

    1. Nagios 简介是一个开源软件,可以监控网络设备网络流量.Linux/windows主机状态,甚至可以监控打印机它可以运行在Linux上或windows上基于浏览器的web界面方便运维人员查看 ...

  3. L107

    It is advisable to take an open- minded approach to new idea. 对新思想采取不存先入之见的态度是明智的.That said, the com ...

  4. 【整理】2-SAT

    2-satisfiability,我们一般将其缩写为 2-sat. 了解全名有助于我们对这个算法的理解.     百度翻译:‘satisfiability’---“可满足性,适定性”. “合取范式可满 ...

  5. Spark入门实战系列

    转自:http://www.cnblogs.com/shishanyuan/p/4699644.html 这一两年Spark技术很火,自己也凑热闹,反复的试验.研究,有痛苦万分也有欣喜若狂,抽空把这些 ...

  6. LeetCode Student Attendance Record I

    原题链接在这里:https://leetcode.com/problems/student-attendance-record-i/description/ 题目: You are given a s ...

  7. python3入门

    简介 计算机基本概念与程序设计语言分类 python风格指南 基础语法 python3 基础语法:基本输入输出 python3 基础语法:标识符和保留字 python3 基础语法:注释 python3 ...

  8. 蓝桥杯 算法训练 ALGO-146 4-2找公倍数

    算法训练 4-2找公倍数   时间限制:1.0s   内存限制:256.0MB        查看参考代码 问题描述 这里写问题描述. 打印出1-1000所有11和17的公倍数. 样例输入 一个满足题 ...

  9. 学习Linux相关书籍

    要推荐的书,我在<那两年炼就的Android内功修养>这篇文章中有提到,这里再列一下出来: 语言类: <深度探索C++对象模型>,对应的英文版是<Inside C+++  ...

  10. [置顶] getenv、setenv函数(获取和设置系统环境变量) 与 环境变量

    1.getenv() 函数名: getenv 功 能: 从环境中取字符串,获取环境变量的值 头文件: stdlib.h 用 法:char *getenv(char *envvar); 函数说明:get ...