/// <summary>
/// 腾讯(被观察者):腾讯下面也有很多业务(公众号,游戏等等...)
/// </summary>
public abstract class TengXun
{
public string Title { get; set; }
public string Content { get; set; }
/// <summary>
/// 存储观察我的人(粉丝)
/// </summary>
private List<IObserver> ObserverList = new List<IObserver>();
/// <summary>
/// 新增观察者(比如有新粉丝关注了我)
/// </summary>
/// <param name="observer"></param>
public void Add(IObserver observer)
{
Console.WriteLine(observer.Name + "成为了你的新粉丝");
ObserverList.Add(observer);
}
/// <summary>
/// 移除观察者(比如有人取关了我)
/// </summary>
/// <param name="observer"></param>
public void Remove(IObserver observer)
{
Console.WriteLine(observer.Name + "取消关注了你");
ObserverList.Remove(ObserverList.First(r => r.Name == observer.Name));
}
/// <summary>
/// 发送消息(我这边发送消息,我会给所有的观察者(粉丝)推送我的消息)
/// </summary>
public void SendMessage(string title, string content)
{
this.Title = title;
this.Content = content;
ObserverList.ForEach(r => r.ReceiveMessage(this));
}
}
/// <summary>
/// 微信公众号(腾讯的一个项目)
/// </summary>
public class WeChatArticle : TengXun
{
}
/// <summary>
/// 和平精英(腾讯游戏)
/// </summary>
public class PeaceElite : TengXun
{
}
/// <summary>
/// 观察者接口
/// </summary>
public interface IObserver
{
string Name { get; set; }
/// <summary>
/// 观察者接收消息
/// </summary>
/// <param name="tengxun"></param>
void ReceiveMessage(TengXunEvent tengxun);
}
/// <summary>
/// 微信公众号的粉丝(观察者):观察微信公众号
/// </summary>
public class WeChatArticleFans : IObserver
{
public WeChatArticleFans(string name)
{
this.Name = name;
}
public string Name { get; set; }
public void ReceiveMessage(TengXunEvent tengxun)
{
Console.WriteLine("{0}收到了微信公众号推送的一篇文章:标题:{1},内容:{2}", this.Name, tengxun.Title, tengxun.Content);
}
}
/// <summary>
/// 腾讯游戏玩家(观察者):观察腾讯游戏
/// </summary>
public class TengXunGamer : IObserver
{
public TengXunGamer(string name)
{
this.Name = name;
}
public string Name { get; set; }
public void ReceiveMessage(TengXunEvent tengxun)
{
Console.WriteLine("{0}收到了和平精英推送的一条消息:标题:{1},内容:{2}", this.Name, tengxun.Title, tengxun.Content);
}
}
private static void TestCommon()
{
//初始化被观察者(微信公众号)
TengXun wechatArticle = new WeChatArticle();
//初始化被观察者(和平精英)
TengXun game = new PeaceElite();
//给微信公众号添加粉丝(观察者)
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:张三"));
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:李四"));
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:王五"));
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:赵柳"));
Console.WriteLine("----------------------------------------------------------");
//给和平精英添加玩家(观察者)
game.Add(new TengXunGamer("和平精英玩家:张无忌"));
game.Add(new TengXunGamer("和平精英玩家:秋刀"));
game.Add(new TengXunGamer("和平精英玩家:琅琊榜"));
game.Add(new TengXunGamer("和平精英玩家:金箍棒"));
game.Add(new TengXunGamer("和平精英玩家:紧箍咒"));
Console.WriteLine("----------------------------------------------------------");
//微信公众号发通知(发表新文章)
wechatArticle.SendMessage("一篇新文章", "来学习设计模式至观察者模式吧");
Console.WriteLine("----------------------------------------------------------");
//和平精英发通知(新动态)
game.SendMessage("和平精英更新啦", "新玩法:火力模式,精英们快来保卫和平吧!");
Console.WriteLine("----------------------------------------------------------");
//取消关注
game.Remove(new TengXunGamer("和平精英玩家:张无忌"));
Console.WriteLine("----------------------------------------------------------");
//再发送新的通知,取消关注的人就收不到推送了
game.SendMessage("(和平精英)您有一条新消息", "万圣节,大家放开嗨");
Console.WriteLine("----------------------------------------------------------");
}
事件实现
public abstract class TengXunEvent
{
public string Title { get; set; }
public string Content { get; set; }
/// <summary>
/// 存储观察我的人(粉丝)
/// </summary>
private event NotifyEventHandler ObserverEvent;
/// <summary>
/// 新增观察者(比如有新粉丝关注了我)
/// </summary>
/// <param name="observerEventHandler"></param>
public void Add(NotifyEventHandler observerEventHandler)
{
ObserverEvent += observerEventHandler;
}
/// <summary>
/// 移除观察者(比如有人取关了我)
/// </summary>
/// <param name="observerEventHandler"></param>
public void Remove(NotifyEventHandler observerEventHandler)
{
ObserverEvent -= observerEventHandler;
}
/// <summary>
/// 发送消息(我这边发送消息,我会给所有的观察者(粉丝)推送我的消息)
/// </summary>
public void SendMessage(string title, string content)
{
this.Title = title;
this.Content = content;
ObserverEvent(this);
}
}
public delegate void NotifyEventHandler(TengXunEvent tengxun);
/// <summary>
/// 微信公众号(腾讯的一个项目)
/// </summary>
public class WeChatArticle : TengXunEvent
{
}
/// <summary>
/// 和平精英(腾讯游戏)
/// </summary>
public class PeaceElite : TengXunEvent
{
}
观察者接口和实现类都不用修改
private static void TestEvent()
{
//初始化被观察者(微信公众号)
TengXunEvent wechatArticle = new WeChatArticle();
//初始化被观察者(和平精英)
TengXunEvent game = new PeaceElite();
//给微信公众号添加粉丝(观察者)
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:张三").ReceiveMessage);
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:李四").ReceiveMessage);
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:王五").ReceiveMessage);
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:赵柳").ReceiveMessage);
Console.WriteLine("----------------------------------------------------------");
//给和平精英添加玩家(观察者)
game.Add(new TengXunGamer("和平精英玩家:张无忌").ReceiveMessage);
game.Add(new TengXunGamer("和平精英玩家:秋刀").ReceiveMessage);
game.Add(new TengXunGamer("和平精英玩家:琅琊榜").ReceiveMessage);
game.Add(new TengXunGamer("和平精英玩家:金箍棒").ReceiveMessage);
game.Add(new TengXunGamer("和平精英玩家:紧箍咒").ReceiveMessage);
Console.WriteLine("----------------------------------------------------------");
//微信公众号发通知(发表新文章)
wechatArticle.SendMessage("一篇新文章", "来学习设计模式至观察者模式吧");
Console.WriteLine("----------------------------------------------------------");
//和平精英发通知(新动态)
game.SendMessage("和平精英更新啦", "新玩法:火力模式,精英们快来保卫和平吧!");
Console.WriteLine("----------------------------------------------------------");
//取消关注
game.Remove(new TengXunGamer("和平精英玩家:张无忌").ReceiveMessage);
Console.WriteLine("----------------------------------------------------------");
//再发送新的通知,取消关注的人就收不到推送了
game.SendMessage("(和平精英)您有一条新消息", "万圣节,大家放开嗨");
Console.WriteLine("----------------------------------------------------------");
}
Program
class Program
{
/// <summary>
/// 观察者模式:
/// 生活中处处可见观察者模式,例如:
/// 微博,如果我发送一篇微博,系统得把我发送的新微博推送给我的每一个粉丝
/// 微信公众号,公众号发送一篇文章,系统会把这篇文章推送给所有关注该公众号的用户
/// ......很多很多
///
/// 像这样子的一对多的关系,我们都可以使用观察者模式去实现它
/// 观察者模式分为:1.观察者;2.被观察者
///
/// 在上面的例子中,观察者就是那些粉丝们(多个),被观察者就是微信公众号或者我本人(一个)
/// 他们一直观察着,一旦被观察者发生变化(发送微博/文章),观察者会立马做出响应(推送微博/文章)
///
/// 此文中我会用两种方式去实现观察者模式:
/// 1.常规实现:基本所有开发语言都可以去实现观察者模式
/// 2..Net方式实现:基于.Net里面的事件机制去实现观察者模式
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//第一种方式
//TestCommon();
//第二种方式:.Net事件
TestEvent();
Console.WriteLine("End");
Console.ReadKey();
}
private static void TestCommon()
{
//初始化被观察者(微信公众号)
TengXun wechatArticle = new WeChatArticle();
//初始化被观察者(和平精英)
TengXun game = new PeaceElite();
//给微信公众号添加粉丝(观察者)
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:张三"));
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:李四"));
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:王五"));
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:赵柳"));
Console.WriteLine("----------------------------------------------------------");
//给和平精英添加玩家(观察者)
game.Add(new TengXunGamer("和平精英玩家:张无忌"));
game.Add(new TengXunGamer("和平精英玩家:秋刀"));
game.Add(new TengXunGamer("和平精英玩家:琅琊榜"));
game.Add(new TengXunGamer("和平精英玩家:金箍棒"));
game.Add(new TengXunGamer("和平精英玩家:紧箍咒"));
Console.WriteLine("----------------------------------------------------------");
//微信公众号发通知(发表新文章)
wechatArticle.SendMessage("一篇新文章", "来学习设计模式至观察者模式吧");
Console.WriteLine("----------------------------------------------------------");
//和平精英发通知(新动态)
game.SendMessage("和平精英更新啦", "新玩法:火力模式,精英们快来保卫和平吧!");
Console.WriteLine("----------------------------------------------------------");
//取消关注
game.Remove(new TengXunGamer("和平精英玩家:张无忌"));
Console.WriteLine("----------------------------------------------------------");
//再发送新的通知,取消关注的人就收不到推送了
game.SendMessage("(和平精英)您有一条新消息", "万圣节,大家放开嗨");
Console.WriteLine("----------------------------------------------------------");
}
private static void TestEvent()
{
//初始化被观察者(微信公众号)
TengXunEvent wechatArticle = new WeChatArticle();
//初始化被观察者(和平精英)
TengXunEvent game = new PeaceElite();
//给微信公众号添加粉丝(观察者)
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:张三").ReceiveMessage);
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:李四").ReceiveMessage);
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:王五").ReceiveMessage);
wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:赵柳").ReceiveMessage);
Console.WriteLine("----------------------------------------------------------");
//给和平精英添加玩家(观察者)
game.Add(new TengXunGamer("和平精英玩家:张无忌").ReceiveMessage);
game.Add(new TengXunGamer("和平精英玩家:秋刀").ReceiveMessage);
game.Add(new TengXunGamer("和平精英玩家:琅琊榜").ReceiveMessage);
game.Add(new TengXunGamer("和平精英玩家:金箍棒").ReceiveMessage);
game.Add(new TengXunGamer("和平精英玩家:紧箍咒").ReceiveMessage);
Console.WriteLine("----------------------------------------------------------");
//微信公众号发通知(发表新文章)
wechatArticle.SendMessage("一篇新文章", "来学习设计模式至观察者模式吧");
Console.WriteLine("----------------------------------------------------------");
//和平精英发通知(新动态)
game.SendMessage("和平精英更新啦", "新玩法:火力模式,精英们快来保卫和平吧!");
Console.WriteLine("----------------------------------------------------------");
//取消关注
game.Remove(new TengXunGamer("和平精英玩家:张无忌").ReceiveMessage);
Console.WriteLine("----------------------------------------------------------");
//再发送新的通知,取消关注的人就收不到推送了
game.SendMessage("(和平精英)您有一条新消息", "万圣节,大家放开嗨");
Console.WriteLine("----------------------------------------------------------");
}
}