觀察者模式和委託

來源:互聯網
上載者:User

用觀察者模式和委託寫一個兔子跑獅子追的例子,看看他們的特點(委託是個類,事件是委託的一個執行個體,事件存在時是個方法的指標)

 

流程:

1.一個獅子,和一個兔子(可以多個委託和觀察者都可以是多個) 

2.獅子和兔子互相看到了

3.兔子開始跑

4.獅子開始追

 

一。委託的例子

程式流程

1.定義一個跑的委託(跑是自然規律之一,人拿槍來了獅子也得跑,是通用的,委託實際就是方法的介面類)

2.兔子類:

  (1).跑的一個執行個體事件,兔子自己跑的行為

  (2).兔子跑的行為方法

3.獅子類:

  (1).獅子追的行為方法

4.情境類(就是頁面)

  (1).有個兔子

  (2).有個獅子

  (3).獅子和兔子見面情境

  (4).兔子跑事件發生會引發獅子追(如果看見了,引發)

public partial class Default2 : System.Web.UI.Page
{
    兔子 兔子1 = new 兔子();
    獅子 獅子1 = new 獅子();
    protected void Page_Init(object sender, EventArgs e)
    {
        兔子1.兔子跑事件 += new 跑(獅子1.追);//是否在這個情境互相看見了,如果看見了,註冊這代碼,這個代碼的實質是把獅子的“追”方法指標告訴“兔子跑事件”
    }
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void 獅子和兔子互相看到了_Click(object sender, EventArgs e)//一個button事件
    {
        兔子1.我跑了();
    }
}
public delegate void 跑(string 跑的東西);
public class 兔子
{
    public event 跑 兔子跑事件;
    public void 我跑了()
    {
        開始跑();
    }
    private void 開始跑()
    {
        if (兔子跑事件 != null)//如果被獅子看見了,如果沒看見,就不通知獅子了,自己隨便跑著玩,沒人追(其實就是註冊的代碼)
        {
            兔子跑事件("兔子1");
        }
    }
}

public class 獅子
{
    public void 追(string 跑的東西)
    {
        System.Web.HttpContext.Current.Response.Write("全國都解放了" + 跑的東西 + "你往那跑");
    }
}

 

二。觀察者例子

 

//“觀察者”介面
public interface IObserver
{
    void Notify(object anObject);
}
//“被觀察對象”介面
public interface IObservable
{
    void Register(IObserver anObserver);
    void UnRegister(IObserver anObserver);
}

//所有被觀察對象的基類
public class ObservableImpl : IObservable
{
    //儲存觀察對象的容器
    protected Hashtable _observerContainer = new Hashtable();
    //註冊觀察者
    public void Register(IObserver anObserver)
    {
        _observerContainer.Add(anObserver, anObserver);
    }
    //撤銷註冊
    public void UnRegister(IObserver anObserver)
    {
        _observerContainer.Remove(anObserver);
    }
    //將事件通知觀察者
    public void NotifyObservers(object anObject)
    {
        //枚舉容器中的觀察者,將事件一一通知給他們
        foreach (IObserver anObserver in _observerContainer.Keys)
        {
            anObserver.Notify(anObject);
        }
    }
}

//業務資料(被觀察對象)
public class SomeData : ObservableImpl
{
    //被觀察者中的資料
    float _askPrice;
    //改變資料的屬性
    public float AskPrice
    {
        set
        {
            _askPrice = value;
            base.NotifyObservers(_askPrice);//將改變的訊息通知觀察者
        }
    }
}
//使用者介面(觀察者)
public class SomeKindOfUI : IObserver
{
    public void Notify(object anObject)
    {
        Console.WriteLine("The new ask price is:" + anObject);
    }
}
//實際調用的過程
public class MainClass
{
    public static void Main()
    {
        //建立觀察者和被觀察者
        SomeKindOfUI ui = new SomeKindOfUI();
        SomeData data = new SomeData();
        //在被觀察對象中註冊觀察者
        data.Register(ui);
        //改變被觀察對象中的資料,這時被觀察者會通知觀察者
        data.AskPrice = 1000f;
        //登出觀察者,停止觀察
        data.UnRegister(ui);
    }
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.