码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式之使用委托和事件实现

时间:2014-11-26 18:32:47      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   color   使用   sp   for   on   

我们先看一下使用抽象类实现观察者模式的类图

 bubuko.com,布布扣

代码如下:

发布者(主题)类    

public class Subject
    {
        private readonly List<Observer> observers = new List<Observer>();
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }
 
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }
 
        public void Notify()
        {
            foreach (var item in observers)
            {
                item.DoWork();
            }
        }
    }

订阅者类    

public abstract class Observer
    {
        public abstract void DoWork();
    }

//订阅类A    

public class ObserverA : Observer
    {
        public override void DoWork()
        {
            Console.WriteLine("Do something for A");
        }
}

订阅类B    

public class ObserverB : Observer
    {
        public override void DoWork()
        {
            Console.WriteLine("Do something for B");
        }
    }

调用类        

public static void Run()
        {
            Subject subject = new Subject();
            //
            Observer a = new ObserverA();
            Observer b = new ObserverB();
            //
            subject.Attach(a);
            subject.Attach(b);
            subject.Notify();
        }

 

这样我们就实现了观察者模式,Subject类依赖于Observer抽象,而不直接依赖于ObserverA B具体的实现,降低了Subject与Observer之间的耦合。然而我们发现Subject类仍然要依赖于Observer抽象,能否消除这两者的耦合呢?

答案当然是可以,那就是用委托和事件来实现

具体代码如下:    

public class Subject
{ 
    //以下为委托实现方式
        public delegate void NotifyEventHandler();
 
        public event NotifyEventHandler NotifyEvent;
 
        public void Notify ()
        {
            if (NotifyEvent != null)
            {
                DoWork();
            }
        }
    }

Observer和实现类A 、B都不用变化

实现类中事件注册方法,代码如下    

public class ObserverExecutor
    { 
        public static void Run()
        {
            Subject subject = new Subject();
            subject.NotifyEvent += new ObserverA().DoWork;
            subject.NotifyEvent += new ObserverB().DoWork;
            //
            subject.NotifyMsg();
        }
    }

以上就是委托和事件实现的观察者模式,我们完全消除了Subject和Observer类之间的耦合,用事件和委托实现的是不是看起来更完美一点哈

 

观察者模式之使用委托和事件实现

标签:style   blog   http   ar   color   使用   sp   for   on   

原文地址:http://www.cnblogs.com/oneheart/p/4123681.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!