• 观察者 delegate event [大话]


      观察者模式就是将一个系统分割成一系列相互协作的类,有一个很不好的副作用,那就是需要维护相关对象间的一致性,但是通过使用委托可以解决这一问题。

    实际上,观察者模式所做的工作其实就是在接触耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。

    下面来看一个例子:员工(观察者)在公司观察其他事情时不能让老板看到,所以要通过前台秘书(通知者),当秘书看到老板回来时,立即打电话通知员工,告诉他们老板回来了,各就各位继续工作。

        /// <summary>
        /// 通知者接口
        /// </summary>
        interface Subject
        {
            /// <summary>
            /// 通知
            /// </summary>
            void Notify();
            string SubjectState
            {
                get;
                set;
            }
        }

    这是通知者接口,它不依赖于观察者,下面是观察者类

     //看股票的同事
        class StockObserver
        {
           
    privatestring name;
           
    private Subject sub;
           
    public StockObserver(string name, Subject sub)
            {
               
    this.name = name;
               
    this.sub = sub;
            }

           
    //关闭股票行情
            publicvoid CloseStockMarket()
            {
                Console.WriteLine(
    "{0}  {1} 关闭股票行情,继续工作!",sub.SubjectState,name);
            }

        }

       
    //看NBA的同事
        class NBAObserver
        {
           
    privatestring name;
           
    private Subject sub;
           
    public NBAObserver(string name, Subject sub)
            {
               
    this.name = name;
               
    this.sub = sub;
            }

           
    //关闭NBA直播
            publicvoid CloseNBADirectSeeding()
            {
                Console.WriteLine(
    "{0}  {1} 关闭NBA直播,继续工作!", sub.SubjectState, name);
            }

        }

    下面是通知者类实现(当秘书无法通知时被老板发现了,这时老板也就是通知者了):

    //声明一个委托
        delegatevoid EventHandler();

       
    //老板类
        class Boss:Subject
        {
           
    //声明一事件Update,类型为委托EventHandler
            publicevent EventHandler Update;
           
    privatestring action;
           
    publicvoid Notify()
            {
               
    //在访问“通知”方法时,调用“更新”
                Update();
            }
           
    publicstring SubjectState
            {
               
    get { return action; }
               
    set { action = value; }
            }
        }

       
    //秘书类
        class Secretary : Subject
        {
           
    //声明一事件Update,类型为委托EventHandler
            publicevent EventHandler Update;
           
    privatestring action;
           
    publicvoid Notify()
            {
               
    //在访问“通知”方法时,调用“更新”
                Update();
            }
           
    publicstring SubjectState
            {
               
    get { return action; }
               
    set { action = value; }
            }
        }

    客户端代码:

    staticvoid Main(string[] args)
    {
                Boss syd
    =new Boss();
                StockObserver tongshi1
    =new StockObserver("张三", syd);
                NBAObserver tongshi2
    =new NBAObserver("李四", syd);

                syd.Update
    +=new EventHandler(tongshi1.CloseStockMarket);
                syd.Update
    +=new EventHandler(tongshi2.CloseNBADirectSeeding);

                syd.SubjectState
    ="我回来了!";
               
    //发出通知
                syd.Notify();
                Console.ReadLine();
     
    }

    委托是一种引用方法类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托的使用可以像其他任何方法一样,具有参数和返回值。委托也可以看作是对函数的抽象,是函数的 ‘类’ ,委托的实例将代表一个具体的函数。

    下面是一个委托的示例:

    syd.Update +=new EventHandler(tongshi1.CloseStockMarket);

    它就等于将 “tongshi1.CloseStockMarket”这个方法委托给“syd.Update”这个方法。

    委托也是有前提的,那就是委托对象所搭载的所有方法必须有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。

    我就是一个'小菜',有很多不足的地方请多指点。

  • 相关阅读:
    python下载.msg文件的附件
    python如何提取word内的图片
    python如何实现对word内段落文本及表格的读取
    python中使用to_excel时如何不覆盖原有数据来新建sheet页
    用python获取表格中的节假日起始日期
    如何利用python的xlrd模块读取日期格式的Excel
    HTML简介
    前端开发工程师
    测试工程师养成记
    电子沙盘
  • 原文地址:https://www.cnblogs.com/p_db/p/2399562.html
Copyright © 2020-2023  润新知