设计模式之观察者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类图
参与者
- Subject(股票)
- 知道它的Observer,所有的Observer都可能观察此对象
- 提供了一个附加和分离Observer的接口
- ConcreteSubject(ibm的股票)
- 保存Observer感兴趣的状态
- 当状态发生变化时.通知Observer
- Observer(股东)
- 为这些要接受通知的ConcreteObserver定义一个更新的接口
- ConcreteObserver(股东)
- 维持对concretesubject的引用
- 存储状态并与Subject的状态保持一致
- 实现observer的更新接口以保持与Subject的状态一致
c#样例
结构性代码演示了当状态发生变化时,将通知和更新注册在Observer模式下的对象.
using System;
using System.Collections;
namespace DoFactory.GangOfFour.Observer.Structural
{
// MainApp test application
class MainApp
{
static void Main()
{
// Configure Observer pattern
ConcreteSubject s = new ConcreteSubject();
s.Attach(new ConcreteObserver(s,"X"));
s.Attach(new ConcreteObserver(s,"Y"));
s.Attach(new ConcreteObserver(s,"Z"));
// Change subject and notify observers
s.SubjectState = "ABC";
s.Notify();
// Wait for user
Console.Read();
}
}
// "Subject"
abstract class Subject
{
private ArrayList observers = new ArrayList();
public void Attach(Observer observer)
{
observers.Add(observer);
}
public void Detach(Observer observer)
{
observers.Remove(observer);
}
public void Notify()
{
foreach (Observer o in observers)
{
o.Update();
}
}
}
// "ConcreteSubject"
class ConcreteSubject : Subject
{
private string subjectState;
// Property
public string SubjectState
{
get{ return subjectState; }
set{ subjectState = value; }
}
}
// "Observer"
abstract class Observer
{
public abstract void Update();
}
// "ConcreteObserver"
class ConcreteObserver : Observer
{
private string name;
private string observerState;
private ConcreteSubject subject;
// Constructor
public ConcreteObserver(
ConcreteSubject subject, string name)
{
this.subject = subject;
this.name = name;
}
public override void Update()
{
observerState = subject.SubjectState;
Console.WriteLine("Observer {0}'s new state is {1}",
name, observerState);
}
// Property
public ConcreteSubject Subject
{
get { return subject; }
set { subject = value; }
}
}
}
Output
Observer Y's new state is ABC
Observer Z's new state is ABC
using System;
using System.Collections;
namespace DoFactory.GangOfFour.Observer.RealWorld
{
// MainApp test application
class MainApp
{
static void Main()
{
// Create investors
Investor s = new Investor("Sorros");
Investor b = new Investor("Berkshire");
// Create IBM stock and attach investors
IBM ibm = new IBM("IBM", 120.00);
ibm.Attach(s);
ibm.Attach(b);
// Change price, which notifies investors
ibm.Price = 120.10;
ibm.Price = 121.00;
ibm.Price = 120.50;
ibm.Price = 120.75;
// Wait for user
Console.Read();
}
}
// "Subject"
abstract class Stock
{
protected string symbol;
protected double price;
private ArrayList investors = new ArrayList();
// Constructor
public Stock(string symbol, double price)
{
this.symbol = symbol;
this.price = price;
}
public void Attach(Investor investor)
{
investors.Add(investor);
}
public void Detach(Investor investor)
{
investors.Remove(investor);
}
public void Notify()
{
foreach (Investor investor in investors)
{
investor.Update(this);
}
Console.WriteLine("");
}
// Properties
public double Price
{
get{ return price; }
set
{
price = value;
Notify();
}
}
public string Symbol
{
get{ return symbol; }
set{ symbol = value; }
}
}
// "ConcreteSubject"
class IBM : Stock
{
// Constructor
public IBM(string symbol, double price)
: base(symbol, price)
{
}
}
// "Observer"
interface IInvestor
{
void Update(Stock stock);
}
// "ConcreteObserver"
class Investor : IInvestor
{
private string name;
private Stock stock;
// Constructor
public Investor(string name)
{
this.name = name;
}
public void Update(Stock stock)
{
Console.WriteLine("Notified {0} of {1}'s " +
"change to {2:C}", name, stock.Symbol, stock.Price);
}
// Property
public Stock Stock
{
get{ return stock; }
set{ stock = value; }
}
}
}
Notified Berkshire of IBM's change to $120.10
Notified Sorros of IBM's change to $121.00
Notified Berkshire of IBM's change to $121.00
Notified Sorros of IBM's change to $120.50
Notified Berkshire of IBM's change to $120.50
Notified Sorros of IBM's change to $120.75
Notified Berkshire of IBM's change to $120.75
转载于:https://www.cnblogs.com/Marvel/archive/2008/08/29/1279258.html
设计模式之观察者Observer相关推荐
- Java设计模式之观察者Observer模式代码示例
- 设计模式学习笔记——观察者(Observer)模式
设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...
- 设计模式:观察者(Observer)模式
设计模式:观察者(Observer)模式 一.前言 观察者模式其实最好的名称应该是"发布订阅"模式,和我们现在大数据之中的发布订阅方式比较类似,但是也有区别的地方,在上一个设计 ...
- 设计模式:观察者模式--Observer
一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...
- Java EE重新审视设计模式:观察者
除了以多种语言和许多应用程序实现之外,Observer Pattern自1.0版以来一直是Java的一部分. 观察者模式也是好莱坞原则的良好实施. 就像好莱坞的特工喜欢回调候选人以代替某个职位,而不是 ...
- Java 设计模式归纳(观察者、工厂、单例、策略、适配器、命令、装饰者、外观、模板方法、状态
DesignPattern 项目地址:youlookwhat/DesignPattern 简介: Java 设计模式归纳 (观察者.工厂.单例.策略.适配器.命令.装饰者.外观.模板方法.状态). ...
- RxSwift之深入解析如何创建观察者Observer
一.什么是观察者? "观察者"是用来监听事件,然后它需要这个事件做出响应.例如:弹出提示框就是观察者,它对点击按钮这个事件做出响应. 那么,什么是观察者呢?其实,响应事件的都是观察 ...
- 设计模式 ( 十七 ):Observer 观察者模式 -- 行为型
1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是 ...
- 设计模式--观察者(Observer)模式
模式定义 定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知并更新 类图 应用场景 当更改一个对象的状态可能需要更改其他对象,并且实际 ...
- 设计模式之观察者模式(Observer)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
最新文章
- matlab 无序数对,MATLAB中sort函数对矩阵数进行排序
- Redis集群理论知识
- mysql utf8 bin设置_[mysql]修改collation为utf8_bin
- 一个服务器多个网站多个域名,多个域名一个服务器吗
- 一个网卡绑定多个IP
- 信息学奥数一本通(1170:计算2的N次方)
- linux arm桌面程序,Electron 从零创建一个 Windows/OS X/Linux 的桌面可执行程序
- stylegan中用到的pixelnorm(PixelNorm)
- 16 台服务器达成 1000 万 tpmC,挑战分布式数据库性能极限
- Mybatis 异常(SQL 语法异常 ambiguous)
- UVa 11991 - Easy Problem from Rujia Liu?
- 商城超卖问题的几种解决方案
- android iphone 记事本,手机上用什么记事本软件好?iPhone求推荐一款便签记事本app...
- UOJ 180【UR #12】实验室外的攻防战
- 蓝海创意云丨建筑设计:BIM技术在异形建筑中的应用(以梅溪湖为例)
- 屏幕录像机(bb flashback pro 4)pjb v4.1.21
- npm ERR! code ETIMEDOUTnpm ERR! errno ETIMEDOUTnpm ERR! network request to http://nexus.h3yun.com:
- 微软宣布2011年4月发布Windows 7 SP1
- 用 Prettier 美化代码
- Cisco AP的led开关如何打开