观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。将观察者(watcher)和被观察者(subject)完美分离。
这里讲一个场景:话说赵丽颖小姐姐最近如日中天,受到很多粉丝喜爱,某天她开通了微博,迅速获得几千万粉丝关注。当然赵丽颖平常发发微博,她的”萤火虫“们收到她的微博的通知后会去评论和留言;当然也不乏有各种各样的喷子,她心情好可以不理这些人,过分的话,去你丫的,姐可以拉黑你!!!
下面就这个场景,我决定用观察者模式将之还原。
我们都知道观察者模式,有四个角色:抽象主题、具体主题、抽象观察者和具体观察者。
话不多说上代码:
AbstractBloger:
代码语言:javascript复制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:
代码语言:javascript复制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:
代码语言:javascript复制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:
代码语言:javascript复制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:
代码语言:javascript复制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();
}
}
}
测试结果: