观察者模式:

在对象之间定义了一种一对多的依赖关系。当一个对象改变它的状态时,全部依赖它的对象会自己主动接收通知并更新自己的状态。

Define a one-to-many dependency between objects so that when one object changes state,
all its dependents are notified and updated automatically.

UML图:

主要包含:

  1. Subjcet(Stock):抽象的主题角色,把全部的观察者保存到一个集合中,每一个主题角色能够有不论什么数量的观察着。而且提供了一个接口来加入和删除观察着。
  2. ConcreteSubject(IBM):详细的主题角色。保存有关的状态信息,当它的状态发生变化时会将消息发送给全部的观察者。

  3. Observer(IInverstor):抽象的观察者角色。定义了一个更新自身的接口,当主题角色状态发生变化时会调用这个接口。

  4. 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;
}

运行输出:

以下是一个详细的样例:

  1. Subject为Stock(股票)
  2. ConcreteSubject为IBM(IBM公司的股票。还能够是其他公司的股票)
  3. Observer为IInvestor(投资者接口)
  4. 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)的更多相关文章

  1. 我理解设计模式C++实现观察者模式Observer Pattern

    概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...

  2. 设计模式系列之观察者模式(Observer Pattern)

    意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作 ...

  3. [设计模式-行为型]观察者模式(Observer)

    一句话 事件监听就是观察者模式最好的例子. 概括

  4. Java学习笔记——设计模式之十.观察者模式

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

  5. 《JAVA设计模式》之观察者模式(Observer)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Mo ...

  6. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  7. Java 设计模式系列(十五)观察者模式(Observer)

    Java 设计模式系列(十五)观察者模式(Observer) Java 设计模式系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Java ...

  8. 二十四种设计模式:观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...

  9. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

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

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

随机推荐

  1. 开源数据库连接池之Tomcat内置连接池

    本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...

  2. C#日志工具汇总

    log4net          log4net是一个可以帮助程序员把日志信息输出到各种不同目标的.net类库.它可以容易的加载到开发项目中,实现程序调试和运行的时候的日志信息输出,提供了比.net自 ...

  3. jsp静态化之简单介绍

    package com.zwd.text; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputS ...

  4. accumulate

    accumulate?就是sum up a range of elements.呵呵.这个挺简单的.以下是这个算法的简单介绍: Syntax: #include <numeric>//呵呵 ...

  5. boost::asio设置同步连接超时

    boost::asio设置同步连接超时   CSDN上求助无果,只好用自创的非主流方法了.asio自带的例子里是用deadline_timer的async_wait方法来实现超时的,这种方法需要单独写 ...

  6. 【Demo 0009】Java基础-异常

    本章学习要点:       1.  了解异常的基本概念:       2.  掌握异常捕获方法以及注意事项;       3.  掌握异常抛出方法:       4.  掌握自定义异常类和异常类继承注 ...

  7. Swift - 使用storyboard创建表格视图(TableViewController)

    项目创建完毕后,默认是使用ViewController作为主界面视图.下面通过样例演示,如何使用TableViewController作为主界面视图,同时演示如何在storyboard中设置表格及内部 ...

  8. Lucene.Net 2.3.1开发介绍 —— 二、分词(四)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(四) 2.1.2 可以使用的内置分词 简单的分词方式并不能满足需求.前文说过Lucene.Net内置分词中StandardAnalyze ...

  9. 移动开发中的Scheme跳转说明——Allowing OtherApps to Start Your Activity

    Allowing OtherApps to Start Your Activity 为了开发更多人使用的App,我们总希望我们的App能够提供一种接口被其他App调用.如我们常见的 大众点评  与  ...

  10. 使用Xcode无法发布程序(Archive按钮一直为灰色不可点击)

    问题现象:想在Xcode中把代码编译发布成ipa程序,但“Product”->“Archive”按钮一直不可使用.   解决办法:目前的运行配置是使用模拟器,改成“iOS Device”即可   ...