一、问题产生背景

又被称为订阅发布模式。

最初流传最广的一个面试题:有一只猫咪,猫咪叫了一声,老鼠跑了,老人惊醒了,男主人骂,小偷吓得不敢动了....这就产生一个问题的模型,当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

二、观察者模式的通常做法

1、 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

2、 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。

3、抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

4、具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

结构图:

三、具体实例

观察者模式的实现方式有几种,下面我们用接口方式实现。

1、首先我们建立观察者的抽象

namespace ObserverPattern
{
public interface IObserver
{
void update(string message); }
}

2、建立被观察者的抽象

namespace ObserverPattern
{
public interface ISubject
{
void Attach(IObserver observer ); void Detach(IObserver observer); void Notify(string message);
}
}

3、观察者实例化

namespace ObserverPattern
{
public class User:IObserver
{
private string _name; public User(string name)
{
_name = name;
} public void update(string message)
{
Console.WriteLine("hi"+_name+","+message);
}
}
}

4、被观察者实例化(注意其中的观察者列表)

namespace ObserverPattern
{
public class SubscriptionSubject:ISubject
{
private List<IObserver> userList = new List<IObserver>(); public void Attach(IObserver observer)
{
userList.Add(observer);
} public void Detach(IObserver observer)
{
userList.Remove(observer);
} public void Notify(String message)
{
foreach (IObserver observer in userList)
{
observer.update(message);
}
} }
}

5、我们整盒调用

namespace ObserverPattern
{
class Program
{
static void Main(string[] args)
{ SubscriptionSubject mSubscriptionSubject = new SubscriptionSubject();
//创建用户
User user1 = new User("林熙蕾");
User user2 = new User("潘春春");
User user3 = new User("罗云绮");
//订阅微博
mSubscriptionSubject.Attach(user1);
mSubscriptionSubject.Attach(user2);
mSubscriptionSubject.Attach(user3);
//博主发通知
mSubscriptionSubject.Notify("刘德华发微博了"); Console.ReadKey(); }
}
}

四、设计模式分析

优点:

支持广播通信。

聚耦合,所有的观察者被抽象为一个接口。

缺点:

时间较长。

内联不足,具体表现在,观察者不能明确知道被观察者如何变化

可能出现循环调用

 点击下载代码

设计模式のObserver Pattern(观察者模式)----行为模式的更多相关文章

  1. 设计模式(二)The Observer Pattern 观察者模式

    问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新 ...

  2. 设计模式之 Observer Pattern 观察者模式

    1.Subject通过一个容器保存零到多个Observer. 2.Subject通过Add,Delete方法调整Observer. 3.Subject的notifyObservers方法实际是逐个调用 ...

  3. 设计模式のCommand Pattern(命令模式)----行为模式

    一.产生背景 熟悉计算机的同学应该清楚,用户发出各种命令,CPU执行命令,OS负责调度.命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象 ...

  4. Observer pattern 观察者模式

    一.认识观察者模式 我们看看报纸和杂志的订阅是怎么回事: 1.报社的业务就是出版报纸. 2.向某家报社订阅报纸,只要他们有新的报纸出版,就会给你送来,只要你是他们的订户,你就会一直收到报纸. 3.当你 ...

  5. 设计模式Design Pattern(4) -- 访问者模式

    什么是访问者模式? 一个对象有稳定的数据结构,却为不同的访问者提供不同的数据操作,对象提供接收访问者的方法,从而保证数据结构的稳定性和操作的多样性.也可以理解为,封装对象的操作方法,达到不改变对象数据 ...

  6. 设计模式复习小结一(Strategy Pattern/Observer Pattern/Decorator Patter/Factory Pattern)

    目录: 前言 1. Stratrgy Pattern 2. Observer Pattern 3. Decorator Pattern 4. Factory Pattern 4.1 FactoryPa ...

  7. 设计模式Design Pattern(1)--简介

    什么是设计模式? 软件开发人员在长期实践中总结出来的解决特定问题的一套解决方案. 对象设计原则 计模式主要是基于以下的面向对象设计原则. 对接口编程而不是对实现编程. 优先使用对象组合而不是继承. 设 ...

  8. Design Pattern: Observer Pattern

    1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...

  9. 深入浅出设计模式——观察者模式(Observer Pattern)

    模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而 ...

随机推荐

  1. Google Maps API Key申请办法(最新)

    之前的Google Maps Api的API Key很容易申请,只需要按照一个简单的表单提交部署的网站地址即可,自动生成API Key并给出引用的路径. 但是最近在处理另外一个项目的时候发现之前的这种 ...

  2. .net 公共基础类

    using WL.Infrastructure.Http; using System; using System.Collections.Generic; using System.IO; using ...

  3. 使用wubi安装ubuntu14.04出现的常见错误的解决办法

    花了一天的时间终于安装上了Ubuntu14.04,过程坎坷,是血泪史,开始报“cannot download the metalink and therefore the ISO”错误,解决后,又报“ ...

  4. A simple problem(湘大邀请赛)

    A simple problem Accepted : 61   Submit : 418 Time Limit : 15000 MS   Memory Limit : 655360 KB Probl ...

  5. Hibernate入门(一)

    1.导包 导入Hibernate最基本的包(不要忘记导入数据库驱动包了!) 下载文件名为黄色框框中的名称的压缩包在对应路径下,有个required包下的所有包就是必备的基本包 2.建表 USE TES ...

  6. webpack4 系列教程(十四):Clean Plugin and Watch Mode

    作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十四):Clean Plugin and Watch Mode>原文地址.更欢迎 ...

  7. php对二维数据排序

    对于一维数组排序比较简单,像使用sort(),asort(),arsort()等函数进行排序,但是对于二维数组比较麻烦,所有借鉴网上的总结了一下 // 对二维数组进行指定key排序 $arr 二维数组 ...

  8. layui 弹出框改变按钮颜色样式 自定义皮肤

    1.在layer下新建文件夹和css 文件: 2.123.css body .layui-ext-yourskin .layui-layer-btn0{ border-color: #55ff83; ...

  9. 关于微信小程序<radio-group>布局排列

    微信小程序更新以后今天<radio>全部变成垂直排列了,布局乱了. 一开始尝试给外层<view>添加display:flex;flex-direction:row:未果. 后来 ...

  10. git 入门教程之远程仓库

    远程仓库 如果说本地仓库已经足够个人进行版本控制了,那么远程仓库则使多人合作开发成为可能. 如果你只是打算自己使用git,你的工作内容不需要发布给其他人看,那就用不到远程仓库的概念. git 是分布式 ...