在软件构建过程中,需要为某些对象建立一种“通知依赖关系”,即一个对象的状态发生改变,所有的依赖对象都需要得到通知。

1、观察者模式简介

1.1>、定义

  定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

1.2>、使用频率

  

2、观察者模式结构

2.1>、结构图

2.2>、参与者

  观察者模式参与者:

  ◊ Subject

    ° 抽象的主题,被观察的对象

    ° 提供Attach和Detach Observer对象的接口

  ◊ ConcreteSubject

    ° 具体的被观察对象,维持ConcreteSubject状态。

    ° 当状态发生变化时,发送消息通知它的观察者。

  ◊ Observer:抽象的观察者,定义一个发送变化通知更新的接口。

  ◊ ConcreteObserver

    ° 维持一个对ConcreteSubject对象的引用

    ° 保存subjects状态

    ° 实现当Observer接口发生变动时,subjects状态同步更新。

  在观察者模式中,Subject通过Attach()和Detach()方法添加或删除其所关联的观察者,并通过Notify进行更新,让每个观察者都可以观察到最新的状态。

3、观察者模式结构实现

  Observer.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ObserverPattern.Structural
{
public abstract class Observer
{
public abstract void Update();
}
}

  Subject.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ObserverPattern.Structural
{
public class Subject
{
private List<Observer> _observers = new List<Observer>(); 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.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ObserverPattern.Structural
{
public class ConcreteSubject : Subject
{
private string _subjectState; /// <summary>
/// Gets or sets subject state
/// </summary>
public string SubjectState
{
get { return _subjectState; }
set { _subjectState = value; }
}
}
}

  ConcreteObserver.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ObserverPattern.Structural
{
public class ConcreteObserver : Observer
{
private string _name;
private string _observerState;
private ConcreteSubject _subject; 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);
} public ConcreteSubject Subject
{
get { return _subject; }
set { _subject = value; }
}
}
}

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.ObserverPattern.Structural; namespace DesignPatterns.ObserverPattern
{
class Program
{
static void Main(string[] args)
{
// 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();
}
}
}

  运行输出:

Observer X's new state is ABC
Observer Y's new state is ABC
Observer Z's new state is ABC
请按任意键继续. . .

4、观察者模式应用分析

  观察者模式适用情形:

  ◊ 当一个抽象模型有两个方面,其中一方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

  ◊ 当对一个对象的改变需要同时改变其他对象,而不需要知道具体有多少对象有待改变。

  ◊ 当一个对象必须通知其他对象,而它又不需要知道其它的通知对象是谁,那些其它对象是谁不影响它发送通知这件事。

  观察者模式特点:

  ◊ 使用面向对象的抽象,Observer模式使得可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。

  ◊ 目标发送通知时,无需指定观察者,通知会自动传播。观察者自己决定是否需要订阅通知。

  ◊ 在C#中的Event。委托充当了Observer接口,而提供事件的对象充当了目标对象,委托是比抽象Observer接口更为松耦合的设计。

C#设计模式系列:观察者模式(Observer)的更多相关文章

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

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

  2. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

  3. 人人都会设计模式:观察者模式--Observer

    https://segmentfault.com/a/1190000012295887 观察者模式是抽像通知者和观察者,达到具体通知者跟具体观察者没有偶合.能达到不管是切换通知者,或者是切换观察者,都 ...

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

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

  5. Android设计模式系列--观察者模式

    观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下.本文以AbstractCursor为例子,展开分析.观察者模式,Observer Patter ...

  6. [设计模式] 19 观察者模式 Observer Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.当一个 ...

  7. PHP设计模式系列 - 观察者模式

    观察者模式 观察者设计模式能够更便利创建和查看目标对象状态的对象,并且提供和核心对象非耦合的置顶功能性.观察者设计模式非常常用,在一般复杂的WEB系统中,观察者模式可以帮你减轻代码设计的压力,降低代码 ...

  8. c#设计模式之观察者模式(Observer Pattern)

    场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...

  9. PHP设计模式系列 - 观察者模式处理订单(异步操作附加功能)

    观察者模式 观察者设计模式能够更便利创建和查看目标对象状态的对象,并且提供和核心对象非耦合的置顶功能性.观察者设计模式非常常用,在一般复杂的WEB系统中,观察者模式可以帮你减轻代码设计的压力,降低代码 ...

  10. JAVA设计模式之观察者模式 - Observer

    有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...

随机推荐

  1. view的滑动冲突解决方案

    一.常见的滑动冲突场景 1.外部滑动方向和内部滑动方向不一致 2.外部滑动方向和内部滑动方向一致 3.上面两种情况的嵌套 二.滑动冲突处理的原则 场景1的处理原则是:当用户左右滑动时,需要让外部的vi ...

  2. 踏上Salesforce的学习之路(一)

    相信通过前面的学习,大家已经拥有了一个属于自己的Salesforce开发者账号,下面,我们将用这个账号正式踏上Salesforce的学习之路. 首先,点击网址:https://developer.sa ...

  3. JAVA面试逻辑题1

    一.计算推理 烧香问题: 有两根不均匀分布的香,每一根烧完的时间都是一小时.用什么办法确定一段15分钟的时间? 解题步骤: 1.点燃第一根的两头,同时点燃第二根的一头: 2.等到第一根燃尽以后,再点燃 ...

  4. Torch7学习笔记(四)StochasticGradient

    使用随机梯度下降训练神经网络 StochasticGradient是一个比较高层次的类,它接受两个参数,module和criterion,前者是模型结构,后者是损失函数的类型.这个类本身有一些参数: ...

  5. 怎么将java web 项目导入idea 中

    1.将 java web 项目导 入idea 中, 显示 然后进行 Configure 配置. 2. 点击 open module settings. 3. 4. 选择jar包. 5. 6. 配置to ...

  6. js二进制与十进制互转

    十进制转换为二进制: var num = 100; console.log(num.toString(2)); toString()方法可把一个 Number 对象转换为一个字符串,并返回结果. 语法 ...

  7. 对Java数组中去除重复项程序分析

    我作为一个Java菜鸟,只会用简单的办法来处理这个问题.如果有大神看到,请略过,感激不尽! 所以首先先分析这道题目:数组中重复的数据进行删除,并且要让数组里的数据按原来的顺序排列,中间不能留空. 既然 ...

  8. 有关JVM配置参数含义

    1.参数的含义-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M-vmargs 说明后面是VM的参数,所以后面的其实都是JV ...

  9. mysql如何在一个字段后面加个字符?

    update city set 字段=concat(字段,'内容');

  10. bzoj2599: [IOI2011]Race(点分治)

    写了四五道点分治的题目了,算是比较理解点分治是什么东西了吧= = 点分治主要用来解决点对之间的问题的,比如距离为不大于K的点有多少对. 这道题要求距离等于K的点对中连接两点的最小边数. 那么其实道理是 ...