陋室铭
永远也不要停下学习的脚步(大道至简至易)

用观察者模式和委托写一个兔子跑狮子追的例子,看看他们的特点(委托是个类,事件是委托的一个实例,事件存在时是个方法的指针)

 

流程:

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);
    }
}

 

posted on 2009-11-18 12:57  宏宇  阅读(684)  评论(0编辑  收藏  举报