什么是观察者模式?
摘自百度百科的说法:观察者模式(有时又被称为发布(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) { }