观察者模式(发布、订阅)之(上) 李朝强 李朝强

简介: 什么是观察者模式? 摘自百度百科的说法:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。

什么是观察者模式?

摘自百度百科的说法:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

 说白了,就是一个主题,可以有N多个观察者,一个观察者,也可以订阅N多个主题。当一个主题,发生改变时,会通知订阅它的观察者,观察者收到通知后,可以做相应的处理。观察者模式,是软件设计模式中的一种。接下里,我们介绍下,使用C#实现的观察者模式。附上代码。

      首先,我们新建一个名为AppObserver的控制台项目。结构如下:

 Strategy目录下新建两个接口,一个IObserver(观察者)、一个ISubject(主题)。让我们看看,这两个接口分别定义了什么?

/*
 * Created by http://www.lichaoqiang.com
 * User: 李朝强
 * Date: 2016/9/2
 * Time: 16:25
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;

namespace AppObserver.Strategy { /// <summary> /// Description of ISubject. /// </summary> public interface ISubject { /// <summary> /// 主题 /// </summary> string Title{get;set;} /// <summary> /// 观察者 /// </summary> List<IObserver> Observers{get;} /// <summary> /// 添加订阅 /// </summary> /// <param name="observer"></param> void AddObserver(IObserver observer); /// <summary> /// 发布 /// </summary> void Publish(); } } 

观察者接口(IObserver):

/*
 * Created by http://www.lichaoqiang.com
 * User: 李朝强
 * Date: 2016/9/2
 * Time: 16:27
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;

namespace AppObserver.Strategy { /// <summary> /// Description of IObserver. /// </summary> public interface IObserver { /// <summary> /// 名称 /// </summary> string Name{get;} /// <summary> /// 主题 /// </summary> List<ISubject> Subjects{get;} /// <summary> /// 通知 /// </summary> void Notify(ISubject subject); /// <summary> /// 订阅 /// </summary> /// <param name="subject"></param> void Subscribe(ISubject subject); /// <summary> /// 取消订阅 /// </summary> /// <param name="subject"></param> void Unsubscribe(ISubject subject); } } 

接下来,新建一个Support文件夹,提供对以上两个接口的实现。具体代码如下:

主题:

/*
 * Created by http://www.lichaoqiang.com
 * User: 李朝强
 * Date: 2016/9/2
 * Time: 16:34
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using AppObserver.Strategy;

namespace AppObserver.Support { /// <summary> /// Description of Subject. /// </summary> public class Subject:ISubject { /// <summary> /// 构造函数 /// </summary> public Subject() { Observers = new List<IObserver>(); } #region ISubject implementation /// <summary> /// 添加观察者 /// </summary> /// <param name="observer"></param> void ISubject.AddObserver(IObserver observer) { Observers.Add(observer); } /// <summary> /// 发布 /// </summary> void ISubject.Publish() { if (null != Observers && Observers.Count > 0) foreach (var item in Observers) {item.Notify(this);} } /// <summary> /// 主题 /// </summary> string ISubject.Title { get; set; } /// <summary> /// 观察者 /// </summary> public List<IObserver> Observers { get; private set; } #endregion } } 

观察者:

/*
 * Created by http://www.lichaoqiang.com
 * User: 李朝强
 * Date: 2016/9/2
 * Time: 16:37
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using AppObserver.Strategy;

namespace AppObserver.Support { /// <summary> /// 观察者 /// </summary> public class Observer:IObserver { /// <summary> /// 构造函数 /// </summary> public Observer() { Subjects = new List<ISubject>(); } /// <summary> /// 构造函数 /// </summary> /// <param name="name"></param> public Observer(String name) : this() { Name = name; } #region IObserver implementation /// <summary> /// 名字 /// </summary> public string Name{ get; private set; } /// <summary> /// 通知 /// </summary> void IObserver.Notify(ISubject subject) { //这里具体可以处理你的业务逻辑 //我们可以通过扩展suject对象,来传递信息 Console.WriteLine("【{0}】收到最新通知(Notify)主题:{1}", this.Name, subject.Title); } /// <summary> /// 订阅 /// </summary> /// <param name="subject">主题</param> void IObserver.Subscribe(ISubject subject) { subject.AddObserver(this); Subjects.Add(subject); } /// <summary> /// 取消订阅 /// </summary> /// <param name="subject">主题</param> void IObserver.Unsubscribe(ISubject subject) { } /// <summary> ///获取已订阅的主题 /// </summary> public List<ISubject> Subjects { get; private set; } #endregion } } 

完成以上几步,就简单的实现了观察者模式。让我们一起来看看效果吧。

场景:张三和李四两个人,一个爱好体育和娱乐,一个爱好体育。于是,张三,拿起IiPhone 6s plus,打开App,点击并订阅了《体育频道》、《娱乐频道》两个栏目,李四看了,也马上掏出小米5s,以迅雷不及掩耳盗铃之势,打开相同的APP,也同样订阅了《体育频道》这档栏目。就在这个时候,远在千里之外的一座大都市,一个S身材的MZ,坐在办公桌前,准备好了资讯内容,准备这个时候,向广大粉丝,推送这些信息。于是,她先把准备好的体育信息,标题为“张继科XXXX”的主题,推送出去。然后,接着隔壁同事老王,负责《娱乐频道》的有痣青年,把主题为《王宝强XXXX》的信息,推送出去。这个时候,张三和李四的手机,不约而同的响起了一声清脆的声音。打开一看,效果如下:

张三和李四,顿时沉迷其中,认认真真的阅读起了这些内容。

 张三、李四虚构故事,以娱大家,博君一笑,夫复何求哈。

目录
相关文章
|
6月前
|
JavaScript 前端开发 API
第二十九章 使用消息订阅发布实现组件通信
第二十九章 使用消息订阅发布实现组件通信
|
6月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
1月前
|
设计模式 消息中间件 安全
C# 一分钟浅谈:观察者模式与订阅发布模式
【10月更文挑战第11天】本文介绍了观察者模式和订阅发布模式,这两种设计模式主要用于实现对象间的解耦。观察者模式通过事件和委托实现一个对象状态改变时通知多个依赖对象;订阅发布模式则通过事件聚合器实现发布者与订阅者之间的解耦。文章详细探讨了这两种模式的实现方式、常见问题及避免方法,帮助开发者在实际项目中更好地应用这些模式,提升代码的可维护性和扩展性。
58 1
|
5月前
|
存储 负载均衡 安全
中间件消息发布-订阅模式
【6月更文挑战第9天】
114 5
|
6月前
|
移动开发 小程序 Go
【社区每周】小程序消息订阅插件升级为消息订阅接口(2022年8月第五期)
【社区每周】小程序消息订阅插件升级为消息订阅接口(2022年8月第五期)
42 0
|
6月前
|
消息中间件 Java
RabbitMQ中的消息发布-订阅模式是什么?如何实现?
RabbitMQ中的消息发布-订阅模式是什么?如何实现?
170 0
|
6月前
|
设计模式
设计模式-观察者(发布订阅)模式
设计模式-观察者(发布订阅)模式
|
存储
06JMS发布/订阅模式
06JMS发布/订阅模式
46 0
|
设计模式 开发者
设计模式之订阅发布模式
设计模式之订阅发布模式
234 0
|
设计模式
关于观察者模式/发布订阅模式我所知道的
关于观察者模式/发布订阅模式我所知道的
105 0