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

什么是观察者模式?

摘自百度百科的说法:观察者模式(有时又被称为发布(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)
		{
		   
		}
 
		
		
上一篇:Delphi的字符串与16进制的相互转换函数的汇编代码


下一篇:FTPClient创建目录失败(makeDirectory)