程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Observer (C# Deleget-Event)

Observer (C# Deleget-Event)

編輯:.NET實例教程

 觀察者模式Java版 http://blog.csdn.Net/nyzhl/archive/2007/12/09/1926130.ASPx

在Java中實現觀察者模式,需要在被觀察者中持有所有觀察者的引用,這樣觀察者和被觀察對象之間存在一定的耦合,只有實現觀察者接口的類的對象才可以注冊到被觀察者中,不夠靈活。
也許是我在吹毛求疵,因為Java已經做的很好了,但是在C#中,有更好的解決方法-Deleget & Event 。

被觀察對象不再需要持有觀察者的引用,只需要定義一個事件,而委托 事件是與類型無關的,它可以指向任意類的某個函數(當然要符合委托的返回值,參數聲明),非常靈活,消除了觀察者和被觀察對象的耦合。

還是昨天的例子:鬧鐘(被觀察對象)響(發送消息),人(觀察者)被驚醒(做出響應)。



using System;

//委托聲明
public delegate void AlarmHandler();

public class AlarmClock ...{
    
    //事件聲明
    private event AlarmHandler AlarmEvent;
    
    public void Alarm() ...{
        //事件觸發
        if(AlarmEvent!=null) ...{
            AlarmEvent();
        }
    }
    
    //觀察者注冊
    public void Registry(Person p) ...{
        //事件隊列的注冊
        this.AlarmEvent += new AlarmHandler(p.Wake);
    }
      
}

public class Person ...{
    
    private string _name;
    
    public Person(string name) ...{
        this._name = name;
    }
    
    public void Wake() ...{
        Console.WriteLine(this._name + " is awake");
    }
    
}

public class Test ...{
    
    public static void Main() ...{
        AlarmClock clock = new AlarmClock();
        Person nyzhl = new Person("Zhao Hongliang");
        Person Bob = new Person("Bob");
        Person Jenny = new Person("Jenny");
        
        clock.Registry(nyzhl);
        clock.Registry(Bob);
        clock.Registry(Jenny);
        
        clock.Alarm();
    }
    
}Zhao Hongliang is awake
Bob is awake
Jenny is awake

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved