设计模式之十:观察者模式(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图:

主要包括:

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

执行结果:

时间: 2025-01-03 05:24:38

设计模式之十:观察者模式(Observer)的相关文章

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

概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设计我们的软件呢?我们能够这样:小明的全部client上都订阅中国证券这个股票,仅仅要股票一有变化,全部的client都会被通知到而且被自己主动更新. 这就是我们的观察者模式,她定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 全部依赖于它的对象都得到通知并被自己主动更新. 类图与实例:

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

 观察者模式(Observer),定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. Subject类: 1 package cn.happy.design_pattern._10publishsubscribe; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Subject { 7 8 private

设计模式入门之观察者模式Observer

//观察者模式定义:定义对戏那个间的一种一对多的依赖关系 //当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新 //实例:用户订阅报纸,当报社出版新报纸时,通知所有的订阅者 //直接上代码,为了理解过程,先上原始代码 //目标对象 public class Subject { private List<Observer> readers = new ArrayList<Observer>(); public void attach(Observer reader)

C#设计模式之十六观察者模式(Observer Pattern)【行为型】

原文:C#设计模式之十六观察者模式(Observer Pattern)[行为型] 一.引言 今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份)把所有的模式写完,2018年,新的一年写一些新的东西.今天我们开始讲"行为型"设计模式的第四个模式,该模式是[观察者模式],英文名称是:Observer Pattern.还是老套路,先从名字上来看看."观察者模式"我第一次看到这个名称,我的理解是,既然有&quo

Java 设计模式系列(十六)观察者模式(Observer)

Java 设计模式系列(十六)观察者模式(Observer) 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 一.观察者模式的结构 Subject:目标对象,通常具有如下功能:

设计模式 - 观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权所有, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove

设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法

观察者模式(Observer Pattern) Java内置 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 观察者模式(observer pattern)详解, 参见: http://blog.csdn.net/caroline_wendy/article/details/26583157 Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观

设计模式学习之观察者模式(Observer,行为型模式)(7)

1.观察者模式又叫做发布-订阅模式. 2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 3.使用观察者模式的好处:维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧密耦合,这样会给维护.扩展和重用都带来不便.什么时候使用观察者模式:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式. private static void M

Java设计模式之观察者模式(Observer Pattern)

Observer Pattern 是一种常用的设计模式,它是一种事件监听模型.该模式有两个角色,一个是Subject, 另一个是Observer.Subject 保存有多个Observer的引用,一旦特定的事件发生,Subject会通知它所有的Observer,Observer得到该通知后执行相关程序逻辑.其中,Observer只有先向Subject注册后才能被Subject知晓.这就像订报纸,只有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单,然后每当新报纸印好时,出版社会通知订阅

[Android&amp;amp;Java]浅谈设计模式-代码篇:观察者模式Observer

观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个Demo来描写叙述一下这种思想,用java内置的Observer来实现这一思想. 好,程序猿是不善言语的,看代码先. 1.demo的结构: 2.先创建我们的主题类Subject,他就是我们本demo的明星类.继承了Observable,顾名思义,就是被观察的类 .其它观察者对他但是虎视眈眈哦(事实上