23种设计模式-17-观察者模式

/// <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("----------------------------------------------------------");
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值