观察者设计模式
- 引言
在现实生活中,处处可见观察者模式,例如,微信中的订阅号,订阅博客和QQ微博中关注好友,这些都属于观察者模式的应用。在这我将分享我对观察者模式的理解。
- 观察者模式的介绍
观察者模式的定义
从生活中的例子可以看出,只要对订阅号进行关注的客户端,如果订阅号有什么更新,就会直接推送给订阅了的用户。从中,我们就可以得出观察者模式的定义。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。
- 观察模式的结构与角色
抽象订阅号(TXNewspaper):抽象主题把所有观察者对象的引用保存在一个列表中,并提供增加和删除观察者对象的操作,抽象主题角色又叫做抽象被观察者角色,一般由抽象类或接口实现。
抽象观察者角色(ISubscriber):为所有具体观察者定义一个接口,在得到主题通知时更新自己,一般由抽象类或接口实现。
具体主题角色(Newspaper ):实现抽象主题接口,具体主题角色又叫做具体被观察者角色。
具体观察者角色(Subscriber ):实现抽象观察者角色所要求的接口,以便使自身状态与主题的状态相协调。
- 代码实现
/// <summary>
/// 抽象的订阅者
/// 抽象的订阅号
/// 具体的订阅者
/// 具体的订阅号
/// 实现
/// </summary>
class Program
{
static void Main(string[] args)
{
TXNewspaper newspaper = new Newspaper("加油", "Have a new Newspapers");
//添加订阅者
newspaper.AddSubscriber(new Subscriber("李勇"));
newspaper.Update();
Console.ReadKey();
}
}
/// <summary>
/// 订阅号抽象类
/// </summary>
public abstract class TXNewspaper
{
//保存订阅者列表
private List<ISubscriber> subscriber = new List<ISubscriber>();
public string Symbol { get; set; }
public string Info { get; set; }
public TXNewspaper(string symbol, string info)
{
this.Symbol = symbol;
this.Info = info;
}
#region 新增对订阅号列表的维护操作
public void AddSubscriber(ISubscriber sub)
{
subscriber.Add(sub);
}
public void RemoveSubscriber(ISubscriber sub)
{
subscriber.Remove(sub);
}
#endregion
public void Update()
{
foreach (ISubscriber sub in subscriber)
{
if (sub != null)
{
sub.PushInformaction(this);
}
}
}
}
/// <summary>
/// 具体的订阅号类
/// </summary>
public class Newspaper : TXNewspaper
{
public Newspaper(string symbol, string info)
: base(symbol, info)
{
}
}
/// <summary>
/// 抽象的订阅者
/// </summary>
public interface ISubscriber
{
void PushInformaction(TXNewspaper txNewspaper);
}
/// <summary>
/// 具体的订阅者
/// </summary>
public class Subscriber : ISubscriber
{
public string Name { get; set; }
public Subscriber(string name)
{
this.Name = name;
}
public void PushInformaction(TXNewspaper txNewspaper)
{
Console.WriteLine("订阅者名字:{0},推送的腾讯新闻详细信息:{1}", Name, txNewspaper.Info);
}
}
}
5.观察者模式的适用场景
在下面的情况下可以考虑使用观察者模式:
当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用的情况下。从方面的这个词中可以想到,观察者模式肯定在AOP(面向方面编程)中有所体现。
6.观察者模式的优缺点
观察者模式,取消了直接依赖,变为间接依赖,这样大大提供了系统的可维护性和可扩展性。这里并不是直接给出观察者模式的实现,而是通过一步步重构的方式来引出观察者模式的实现,相信通过这个方式,大家可以更深刻地理解观察者模式所解决的问题和带来的好处。