设计模式之十:观察者模式(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) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
随机推荐
- 开源数据库连接池之Tomcat内置连接池
本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...
- C#日志工具汇总
log4net log4net是一个可以帮助程序员把日志信息输出到各种不同目标的.net类库.它可以容易的加载到开发项目中,实现程序调试和运行的时候的日志信息输出,提供了比.net自 ...
- jsp静态化之简单介绍
package com.zwd.text; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputS ...
- accumulate
accumulate?就是sum up a range of elements.呵呵.这个挺简单的.以下是这个算法的简单介绍: Syntax: #include <numeric>//呵呵 ...
- boost::asio设置同步连接超时
boost::asio设置同步连接超时 CSDN上求助无果,只好用自创的非主流方法了.asio自带的例子里是用deadline_timer的async_wait方法来实现超时的,这种方法需要单独写 ...
- 【Demo 0009】Java基础-异常
本章学习要点: 1. 了解异常的基本概念: 2. 掌握异常捕获方法以及注意事项; 3. 掌握异常抛出方法: 4. 掌握自定义异常类和异常类继承注 ...
- Swift - 使用storyboard创建表格视图(TableViewController)
项目创建完毕后,默认是使用ViewController作为主界面视图.下面通过样例演示,如何使用TableViewController作为主界面视图,同时演示如何在storyboard中设置表格及内部 ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(四)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(四) 2.1.2 可以使用的内置分词 简单的分词方式并不能满足需求.前文说过Lucene.Net内置分词中StandardAnalyze ...
- 移动开发中的Scheme跳转说明——Allowing OtherApps to Start Your Activity
Allowing OtherApps to Start Your Activity 为了开发更多人使用的App,我们总希望我们的App能够提供一种接口被其他App调用.如我们常见的 大众点评 与 ...
- 使用Xcode无法发布程序(Archive按钮一直为灰色不可点击)
问题现象:想在Xcode中把代码编译发布成ipa程序,但“Product”->“Archive”按钮一直不可使用. 解决办法:目前的运行配置是使用模拟器,改成“iOS Device”即可 ...