C#通熟易懂观察者模式
观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。将观察者(watcher)和被观察者(subject)完美分离。
这里讲一个场景:话说赵丽颖小姐姐最近如日中天,受到很多粉丝喜爱,某天她开通了微博,迅速获得几千万粉丝关注。当然赵丽颖平常发发微博,她的”萤火虫“们收到她的微博的通知后会去评论和留言;当然也不乏有各种各样的喷子,她心情好可以不理这些人,过分的话,去你丫的,姐可以拉黑你!!!
下面就这个场景,我决定用观察者模式将之还原。
我们都知道观察者模式,有四个角色:抽象主题、具体主题、抽象观察者和具体观察者。
话不多说上代码:
AbstractBloger:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Observer { /// <summary> /// 开通博客的博主们 /// </summary> public abstract class AbstractBloger { /// <summary> /// 粉丝列表 /// </summary> private List<AbstractFan> fans = new List<AbstractFan>(); /// <summary> /// 博主姓名 /// </summary> public string BlogerName { get; set; } /// <summary> /// 博主构造函数 /// </summary> /// <param name="name">博主姓名</param>s public AbstractBloger(string name) { this.BlogerName = name; } /// <summary> /// 添加一个订阅者(粉丝) /// </summary> /// <param name="observer">具体的订阅者(粉丝)对象</param> public void AddObserver(AbstractFan observer) { if (fans.Contains(observer)) { return; } fans.Add(observer); Console.WriteLine($"{observer.name}关注了她"); } /// <summary> /// 删除一个订阅者(粉丝) /// </summary> /// <param name="observer">具体的订阅者(粉丝)对象</param> public void RemoveObserver(AbstractFan observer) { if (fans.Contains(observer)) { fans.Remove(observer); } } /// <summary> /// 博主发表博客,此时粉丝会收到通知 /// </summary> public void PublishBlog() { Console.WriteLine($"{this.BlogerName}发表了博客"); //遍历通知每一个订阅者(粉丝) foreach (AbstractFan ob in fans) { if (ob != null) { ob.Receive(this); } } } } }
Bloger:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Observer { /// <summary> /// 具体的订阅博主类 /// </summary> public class Bloger : AbstractBloger { public Bloger(string name) : base(name) { Console.WriteLine($"{name}开通博客了"); } } }
AbstractFan:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Observer { /// <summary> /// 关注博主的粉丝们 /// </summary> public abstract class AbstractFan { public string name { get; set; } public AbstractFan(string name) { this.name = name; } public abstract void Receive(AbstractBloger bloger); } }
Fan:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Observer { public class Fan:AbstractFan { /// <summary> /// 观察者(粉丝)名字 /// </summary> private string _Name; public string Name { get { return _Name; } set { _Name = value; } } /// <summary> /// 观察者(粉丝)构造函数 /// </summary> /// <param name="name">观察者(粉丝)名字</param> public Fan(string name):base(name) { this._Name = name; } /// <summary> /// 观察 /// </summary> /// <param name="blog"></param> public override void Receive(AbstractBloger bloger) { Console.WriteLine("{0}观察到了:{1}发布的一篇博客", Name, bloger.BlogerName); } } }
测试程序Program.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Observer; namespace ObserverTest { class Program { static void Main(string[] args) { //赵丽颖某天开通了博客 AbstractBloger bloger = new Bloger("赵丽颖"); //创建订阅者 AbstractFan me = new Fan("铁粉"); AbstractFan penzi = new Fan("喷子粉"); AbstractFan jiangshi = new Fan("僵尸粉"); Console.WriteLine("有很多粉丝都关注了她"); //添加对赵丽颖的关注 bloger.AddObserver(me); bloger.AddObserver(penzi); bloger.AddObserver(jiangshi); //赵丽颖发布博客 bloger.PublishBlog(); Console.WriteLine("有个喷子经常喷赵丽颖"); Console.WriteLine("赵丽颖一怒之下将此喷子拉黑"); bloger.RemoveObserver(penzi); bloger.PublishBlog(); Console.ReadLine(); } } }