轩辕kuku
论坛版主
论坛版主
  • UID14
  • 粉丝6
  • 关注1
  • 发帖数78
  • 社区居民
  • 原创写手
阅读:972回复:0

C#开发基础——观察者模式(Observer)

楼主#
更多 发布于:2016-06-18 09:38
在之前的帖子里面写过Unity3d中的单例模式,另外在C#开发中有一个中观察者模式,其主要核心也就是委托与事件。
什么是观察者模式?
观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。比如Unity中的消息系统。
首先从Copy一个经典的例子——烧水器的例子,大家可以百度一下,会很多有这个例子的介绍。
public class DelegateTest : MonoBehaviour {
    Heater M_heater;
    Display M_Display;
    // Use this for initialization
    void Start () {
   
        M_heater = new Heater("Geli");
        M_Display = new Display();
        M_heater.BoiledDelegateEvent += M_Display.DisPlayHandle;//注册事件                          (4)
        StartCoroutine(M_heater.BoilWaterIEnu());
    }
       
    // Update is called once per frame
    void Update () {
       
    }
}
 //定义事件传递的参数
  public class BoliedEventArgs : EventArgs
    {
        public readonly int temperature;
        public BoliedEventArgs(int temperature) {
            this.temperature = temperature;
        }
    }
   
public class Heater
{
    public int temperature;
    public delegate void BoiledDelegate(object sender,BoliedEventArgs e);                           (1)
    public event BoiledDelegate BoiledDelegateEvent;                                                (2)
    public string name;
    public Heater(string _name) 
    {
        this.name = _name;
    }
    public IEnumerator BoilWaterIEnu()
    {
        for (int i = 0; i <= 100; i++) {
            temperature = i;
            yield return new WaitForSeconds(1);
            BoliedEventArgs e = new BoliedEventArgs(temperature);
            if (BoiledDelegateEvent!=null)//如果该事件有注册,即存在订阅者
                BoiledDelegateEvent(this,e);                                                         (3)
        }
   }
}
   
   
public class Display
{
    public void DisPlayHandle(object sender, BoliedEventArgs e)
    {
        Debug.Log("Heater'Name " + ((Heater)sender).name + ";Temperature:" + e.temperature);
        if (e.temperature > 95)
        {
            Debug.Log("Alarm !!!!!Heater'Name " + ((Heater)sender).name + ";Temperature:" + e.temperature);
        }
    }
}
打印出来:

图片:11111.png


 上面的例子由一个热水器和一个显示器组成。在写代码的过程为了让这两个“部件分离”,使得代码可以复用,就可以采用订阅和发布方式将他们连接起来。
观察者模式的实现步骤:
(1)定义一个委托,用于事件的传递,

(2)定义一个上面委托类型的事件;
(3)判断事件是否被注册,被注册则执行事件源
(4)注册事件到监听函数

欢迎分享

游客

返回顶部