您现在的位置是:主页>文章>C# 设计模式(9)--观察者模式 网站首页

C# 设计模式(9)--观察者模式

一,引言

这个系列是本人对设计模式的一些看法,希望能让对设计模式有兴趣的朋友,以此入门,写的不当之处欢迎指出。转载的朋友请留下原文链接。下面为大家介绍一种设计模式——观察者模式。

二,定义

观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。

定义如下:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

三,简单例子

事例:顾客进门,饭店老板通知伙计给顾客服务。

namespace ObserverDemo
{
    //通知者接口
    public interface ISubject
    {
        // 增加观察者
         void Attach(IObserver obv);
       
        // 移除观察者
         void Detach(IObserver obv);

        // 通知
         void Notify();
    }
}
namespace ObserverDemo
{
    //观察者接口
    public interface IObserver
    {
        void Update(); 
    }
}
namespace ObserverDemo
{
    /// 
    /// 具体观察者
    /// 
    public class XzObserver:IObserver
    {
        public string Name { get; set; }

        public void Update()
        {
            Console.WriteLine("{0},别偷懒,马上干活", this.Name);
        }
    }
}
namespace ObserverDemo
{
    /// 
    /// 具体观察者类
    /// 
    public class XhObserver : IObserver
    {
        public string Name { get; set; }
        public void Update()
        {
            Console.WriteLine("{0},别偷懒,马上干活", this.Name);
        }
        
    }
}
namespace ObserverDemo
{
    /// 
    /// 具体通知者
    /// 
    public class BossSubject : ISubject
    {
        List observers = new List();
        public void Attach(IObserver obv)
        {
            if (obv != null || !observers.Contains(obv))
            {
                observers.Add(obv);
            } 
        }

        public void Detach(IObserver obv)
        {
            if (observers != null && observers.Contains(obv))
            {
                observers.Remove(obv);
            }  
        }

        public void Notify()
        {
            foreach (IObserver o in observers)
            {
                //通知每一个观察者,使得每一个观察者修改自身状态  
                o.Update();
            }  
        }
        /// 
        /// 发现顾客
        /// 
        public void FindCustomers()
        {
            Console.WriteLine("顾客进门了!");
            Notify();
        } 
    }
}

namespace ObserverDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            XzObserver xz = new XzObserver { Name = "小张" };
            XhObserver xh = new XhObserver { Name = "小华" };
            BossSubject boss = new BossSubject();
            boss.Attach(xz);
            boss.Attach(xh);
            boss.FindCustomers();
        }
    }
}

四,总结

通过把依赖类注册到主体类中,当主体类发生变化时,所有依赖类都得到了通知。观察者模式其实是在解除耦合,让耦合的双方都依赖于抽象而不依赖于具体,从而使得各自的变化都不会影响到另一边的变化。

Top