观察者 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”这个方法。

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

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

原文地址:https://www.cnblogs.com/p_db/p/2399562.html