zoukankan      html  css  js  c++  java
  • event 实现观察者模式

    看了一些其他人写的,一下就晕了,还是自己写一个给自己看吧。

    用event语法糖实现的观察者,与普通的实现,最大的区别在于,Subject的操作中不会直接触发Observer的Update,而是通过event间接实现。

    特别注意,标准的观察者模式中,Subject需要Attach所需的Observer,然后执行通知时,依次调用Observer的方法,而用event时,就是将Subject的event绑定所有要调用的Observer的行为,执行时,调用event即可。

    1.最直接的版本如下。定义Subject的Notify,里面触发事件,事件调用绑定的Observer的方法。而绑定操作放到场景类的Main中实现。(ObserverA为子类,略了。)

        public class Subject
        {
            public delegate void Notice();
            public event Notice NoticeEvent;
    
            public void Notify()
            {
                Console.WriteLine("发送通知");
                if (NoticeEvent != null)
                    NoticeEvent();
            }
        }
        public class Observer
        {
    
            public virtual void Update()
            {
                Console.WriteLine("得到通知");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                var subject = new Subject();
                var observer = new Observer();
                var observerA = new ObserverA();
                subject.NoticeEvent += new Subject.Notice(observer.Update);
                subject.NoticeEvent += new Subject.Notice(observerA.Update);
                subject.Notify();
            }
        }

     2.进一步的设计,可以不暴露Observer的Update方法,通过一个包装的Bind方法来绑定二者。如下:

        public class Subject
        {
            public delegate void Notice();
            public event Notice NoticeEvent;
    
    
            public void Notify()
            {
                Console.WriteLine("发送通知");
                if (NoticeEvent != null)
                    NoticeEvent();
            }
        }
        public class Observer
        {
    
            public void Bind(Subject subject)
            {
                subject.NoticeEvent += new Subject.Notice(Update);
            }
    
            protected virtual void Update()
            {
                Console.WriteLine("得到通知");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                var subject = new Subject();
                var observer = new Observer();
                var observerA = new ObserverA();
                observer.Bind(subject);
                observerA.Bind(subject);
                subject.Notify();
            }
        }

     3.如果考虑与以前的观察者模式的Attach方法一致,还可以在Subject中设计Attach方法,封装调用Observer的Bind,没有实际意义,只是保持接口一致。

  • 相关阅读:
    给Apache增加SSI支持(shtml的奥秘)
    Raphael实现商品来源去向图
    有趣的居中方式
    oc-基本语法
    APMServ 配置记录
    解决Mac Chrome打开HTTPS证书错误问题
    JavaScript生成GUID的算法
    Backbone模型
    利用apply和arguments复用方法
    软件复用的几种方式
  • 原文地址:https://www.cnblogs.com/dev2007/p/5889462.html
Copyright © 2011-2022 走看看