• 技术文章 >后端开发 >C#.Net教程

    C#设计模式-观察者模式的另类的示例代码总结

    黄舟黄舟2017-03-18 13:28:40原创778
    订阅-分发模式,又叫观察者模式,那么这种模式它的实现机理是什么?它该如何在产品开发中实际应用呢? 我们学一种模式,最好不要死板的去学它,可以分布根据业务的需求将伪代码逐渐转化为真正的代码。自己画画图,编编码,体会这种机制,这样完全实践一遍后,才能真正用于以后的产品开发中。

    写完后,画的类图:


    这里写图片描述

    php入门到就业线上直播课:进入学习



    首先,通过名字看出,得先订阅,然后,等到发送人,或者叫主办方,写好东西后,比如一篇体育新闻,最新热点,点击发送,这样会发送给所有订阅这个节目的人。

    那么,我们看到这个关系是典型的一对多的关系,比如一是指主办单位,多是指那些订阅了这个报刊的个人,可能是10几个,或者成千上百个。这么些订阅人中,可能一类是体育迷,一类是官场混的。

    因此,我们首先建一个主办方的模型:

    public class Sender 
    {   //主办方,此处称为消息发送者}

    还得有想订阅这些报刊的人的模型:

    public class Receiver 
    {   //订阅报刊的人,此处称为接受者
       private string _name;   private Subject _sub;   public Receiver(string name, Subject sub)
       {       this._name = name;       this._sub = sub;    
       }
    }

    并且,注意此处,订阅报刊的人可能有多个呢!所有建立一个订阅这些报刊的人的集合类:

    public class ReceiverCollection
    {   //这个集合维护着订阅报刊的人
    
       //封装一个订阅人的列表
       private List<Receiver> _receivers = new List<Receiver>();   public List<Receiver> ReceiverList
       {     get
         {       return _receivers;
          }
       }    //管理订阅人:增加一个订阅人,移除一个,统计人数
        public void AddReceiver(Receiver r)
        {       this._receivers.Add(r);
        }    public void RemoveReceiver(Receiver r)
        {       if(this._receivers.Contains(r))           this._receivers.Remove(r);       else 
              throw new ArgumentException("此人未订阅此报刊");
        }    public int ReceiverCount
        {       get
           {          return _receivers.Count;
           }
        }
    
    }

    好了,我们有了主办方对象的架子,订阅人对象,订阅人集合对象,用来管理订阅人。一对多的模型架子已经架起来了,接下来,我们该实现这些对象各自的行为了!

    我们知道,主办方要在分发之前,就得掌握需要分发给哪些人,除了知道给谁发之外,主办方还要想好稿子,也就是发布内容或主题完成后,下一步,把内容或主题发送给所有的订阅人!

    那么主办方的这个行为,兑现为代码,是怎样的呢?在已有架子的基础上,修改

    public class Sender 
    {   //主办方,此处称为消息发送者
    
       //要知道分发给哪些人
       private ReceiverCollection _receColl;   public Sender(ReceiverCollection receColl)
       {     this._receColl = receColl;
       }   //主办方确定 分发主题
       public List<Subject> SendingSubjects {get; set;}   //主办方通知多个订阅人
        public void Notify()
        {       //执行更新事件
           UpdateEvent();
        }    //因此需要定义一个主办方在通知订阅人时,执行的更新事件
        //事件搭载各类订阅人在收到主题后的行为!!!
        //当事件触发时,回调搭载的各类订阅人收到主题后的行为!!!
        public delegate void MyEventHandler();    public event EventHandler UpdateEvent;
    }

    分发主题Subject 的模型为:

    public class Subject
    {   //主题话题
       public string Topic {get;set;}   //主题摘要
       public string SubAbstract {get;set;}   //主题内容
       public string Content {get;set;}
    }

    各个对象模型及各自的行为都写好后,我们就可以使用这些对象了。

    首先,主办方定义了两个主题,

                ReceiverCollection receColl = new ReceiverCollection();
                Sender sender = new Sender(receColl );
                Subject sportSubject = new Subject()
                {
                    Topic = "Sport",
                    SubAbstract = "篮球,足球,乒乓球",
                    Content = "2018年俄罗斯世界杯,今天晚上国足迎来出线的关键争夺战!"
                };
                sender.SendingSubjects.Add(sportSubject);
                Subject newsSubject = new Subject()
                {
                    Topic = "News",
                    SubAbstract = "国内大事 国际纵横",
                    Content = "十九大,即将召开,请前来参会!"
                };

    添加一个订阅人的接口,两类订阅人对象,当UpdateEvent事件触发时,回调搭载的各类订阅人收到主题后的行为,比如说看到主题今晚国足有比赛后,郝海东会看比赛。

    public interface IResponse
    {    void WillDo();   
    }public class SportsReceiver:Receiver,IResponse
    {   public void WillDo()
       {
          Console.WriteLine("I will watch tv tonight, good luck for gays"); 
       }  public SportsReceiver(string name, Subject subject)
                : base(name, subject)
            {
    
            }
    }public class NewsReceiver:Receiver,IResponse
    {   public void WillDo()
       {
          Console.WriteLine("I am going to Beijing to meeting"); 
       }   public NewsReceiver(string name, Subject subject)
                : base(name, subject)
            {
    
            }
    }

    然后添加2个订阅者

    //添加一位体育大牛:郝海东receColl.AddReceiver(new SportReceiver("Hao Haidong", sender.newsSubjects[0]));
    //添加县长:钱烈贤receColl.AddReceiver(new NewsReceiver("Qian Liexian", sender.newsSubjects[1]));

    确定主办方发送后,订阅者的行为,这里采取先注册,后发送主题后,回调的方式,触发订阅者的行为:

    //要在此处注册订阅者看到消息后的反应foreach(var rece in receColl)
      sender.UpdateEvent += new MyEventHandler(rece.WillDo);

    主办方开始发送主题给订阅者:

    sender.Notify();

    这样,收到主办方发送的消息后,订阅人回调他们的WillDo的方法,这样整个订阅-分发-回调的过程就闭合了!!!

    以上就是C#设计模式-观察者模式的另类的示例代码总结的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    快捷开发Web应用及小程序:点击使用

    支持亿级表,高并发,自动生成可视化后台。

    上一篇:C#设计模式-派生类实现非虚接口陷阱的实例代码分享 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误• asp.net 图片验证码的HtmlHelper• ASP.NET使用Ajax如何返回Json对象的方法具体介绍• 详解ASP.NET配置文件Web.config• C/C++深度分析
    1/1

    PHP中文网