设计模式之十:观察者模式(Observer)
观察者模式:
在对象之间定义了一种一对多的依赖关系。当一个对象改变它的状态时,全部依赖它的对象会自己主动接收通知并更新自己的状态。
Define a one-to-many dependency between objects so that when one object changes state,
all its dependents are notified and updated automatically.
UML图:
主要包含:
- Subjcet(Stock):抽象的主题角色,把全部的观察者保存到一个集合中,每一个主题角色能够有不论什么数量的观察着。而且提供了一个接口来加入和删除观察着。
- ConcreteSubject(IBM):详细的主题角色。保存有关的状态信息,当它的状态发生变化时会将消息发送给全部的观察者。
- Observer(IInverstor):抽象的观察者角色。定义了一个更新自身的接口,当主题角色状态发生变化时会调用这个接口。
- ConcreteObserver(Investor):详细的观察着,持有一个主题角色的引用,实现了抽象观察者定义的更新自身的接口,以便使自身的状态与主题的状态相协调。
观察者模式的C++代码实现例如以下:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <list>
using namespace std;
class Subject;
class Observer
{
public:
Observer()
{
}
Observer(Subject* s,string n)
{
subject=s;
name=n;
}
virtual void update()=0;
string getName()
{
return name;
}
Subject * getSubject()
{
return subject;
}
private:
Subject *subject;
string name;
};
class Subject
{
public:
void attach(Observer * o)
{
lists.push_back(o);
}
void detach(Observer * o)
{
lists.remove(o);
}
void notify()
{
list<Observer *>::iterator iter=lists.begin();
for(;iter!=lists.end();iter++)
{
(*iter)->update();
}
}
virtual string getState()=0;
private:
list<Observer*> lists;
};
class ConcreteSubject :public Subject
{
public:
string getState()
{
string str("ConcreteSubject notify");
return str;
}
};
class ConcreteObserver:public Observer
{
public:
ConcreteObserver(Subject * s,string n):Observer(s,n)
{
}
void update()
{
std::cout<<getName()<<" update from "<<getSubject()->getState()<<std::endl;
}
};
int main()
{
Subject *s=new ConcreteSubject();
Observer *o1=new ConcreteObserver(s,"Bill");
Observer *o2=new ConcreteObserver(s,"Joe");
s->attach(o1);
s->attach(o2);
s->notify();
delete s;
delete o1;
delete o2;
return 0;
}
运行输出:
以下是一个详细的样例:
- Subject为Stock(股票)
- ConcreteSubject为IBM(IBM公司的股票。还能够是其他公司的股票)
- Observer为IInvestor(投资者接口)
- ConcreteObserver为Investor(就详细的投资者。即持有股票的人)
一种股票能够被多个投资者持有,即存在一种一对多的依赖关系,当股票的价格发生变化时须要通知全部持有这些股票的投资者(即观察者)。
UML类图例如以下:
C++代码实现例如以下:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <list>
using namespace std;
class Stock;
class IInvestor
{
public:
IInvestor()
{
}
IInvestor(string str,Stock *s):name(str),stock(s)
{
}
Stock * getStock()
{
return stock;
}
string getName()
{
return name;
}
virtual void update()=0;
private:
Stock * stock;//投资的股票
string name;//投资人名称
};
class Stock
{
public:
Stock()
{
}
Stock(string str,double p):symbol(str),price(p)
{
}
void setPrice(double p)
{
price=p;
notify();
std::cout<<std::endl;
}
double getPrice()
{
return price;
}
string getSymbol()
{
return symbol;
}
void attach(IInvestor * ii)
{
investors.push_back(ii);
}
void deattach(IInvestor *ii)
{
investors.remove(ii);
}
void notify()
{
list<IInvestor*>::iterator iter=investors.begin();
for(;iter!=investors.end();iter++)
{
(*iter)->update();
}
}
private:
string symbol; //股票名称
double price;//股票价格
list<IInvestor *> investors;//投资者
};
class IBM:public Stock
{
public:
IBM()
{
}
IBM(string symbol,double price):Stock(symbol,price)
{
}
};
class Investor :public IInvestor
{
public:
Investor()
{
}
Investor(string n,Stock *s):IInvestor(n,s)
{
}
void update()
{
std::cout<<"Notified "<<getName()<<" of "<<getStock()->getSymbol()<<"'s change to "<<getStock()->getPrice()<<std::endl;
}
};
int main()
{
std::cout<<"股票交易的观察着模式的实现"<<std::endl;
IBM *ibm=new IBM("IBM",120.10);
IInvestor* investor1=new Investor("Sorros",ibm);
IInvestor* investor2=new Investor("Berkshire",ibm);
ibm->attach(investor1);
ibm->attach(investor2);
ibm->setPrice(120.50);
ibm->setPrice(120.75);
delete ibm;
delete investor1;
delete investor2;
return 0;
}
运行结果:
设计模式之十:观察者模式(Observer)的更多相关文章
- 我理解设计模式C++实现观察者模式Observer Pattern
概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...
- 设计模式系列之观察者模式(Observer Pattern)
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作 ...
- [设计模式-行为型]观察者模式(Observer)
一句话 事件监听就是观察者模式最好的例子. 概括
- Java学习笔记——设计模式之十.观察者模式
观察者模式(Observer),定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. Subject类: ...
- 《JAVA设计模式》之观察者模式(Observer)
在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Mo ...
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
- Java 设计模式系列(十五)观察者模式(Observer)
Java 设计模式系列(十五)观察者模式(Observer) Java 设计模式系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Java ...
- 二十四种设计模式:观察者模式(Observer Pattern)
观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
随机推荐
- 搭建Go开发及调试环境(LiteIDE + GoClipse)
搭建Go开发及调试环境(LiteIDE + GoClipse) -- Windows篇 这里以Windows7 64位为例,如果是32位环境需安装对应版本程序. 一.安装golang1.2.2 1.3 ...
- Cloudera Hadoop 4 实战课程(Hadoop 2.0、集群界面化管理、电商在线查询+日志离线分析)
课程大纲及内容简介: 每节课约35分钟,共不下40讲 第一章(11讲) ·分布式和传统单机模式 ·Hadoop背景和工作原理 ·Mapreduce工作原理剖析 ·第二代MR--YARN原理剖析 ·Cl ...
- Tui-x简单介绍
1.什么是Tui-x Tui-x是一个创建cocos2d-x UI界面的解决方式,而builder用的则是FlashCS,通过使用jsfl来拓展FlashCS从而达到UI编辑器的功能.这个jsfl所做 ...
- Tomcat详细用法学习(四)
本篇接上一篇<Tomcat详细用法学习(三)>,主要讲解配置虚拟主机.打包web应用成war包和Tomcat的体系结构 对于Tomcat服务器,可以放置多个网站(多个web应用),这就是讲 ...
- Custom draw 和 Owner draw 的区别
"Custom Draw" is a feature shared by all of Microsoft's common controls, which allows you ...
- Eclipse无提示的解决办法 和 内容辅助技巧
Eclipse无提示的解决办法 和 内容辅助技巧 一.若发现内容辅助失效没有提示 下面是解决办法,现贴出来与大家共享: 1.菜单window->Preferences->Jav ...
- 关于SIGSLOT的一个简单的程序
废话少说直接看代码即可,这只是一个简单的程序,可以帮我们简单地明白SIGSLOT是怎么回事.至于深入研究自己去百度吧. #include "sigslot.h" using nam ...
- 与众不同 windows phone (5) - Chooser(选择器)
原文:与众不同 windows phone (5) - Chooser(选择器) [索引页][源码下载] 与众不同 windows phone (5) - Chooser(选择器) 作者:webabc ...
- cct信息安全
基本信息 全国计算机等级考试三级教程——信息安全技术(2016年版) 作 者:教育部考试中心 编 出 版 社:高等教育出版社 出版时间:2015-12-1 ISBN:9787040443035 ...
- 线段树菜鸟一题+归并排序【求逆序数】POJ2299
题目链接:http://poj.org/problem?id=2299 归并排序解法链接:http://blog.csdn.net/lyy289065406/article/details/66473 ...