代码改变世界

观察者模式

2012-06-23 08:16  chengzhang  阅读(168)  评论(0)    收藏  举报

刚刚申请博客,以后会用它来记录自己软件学习中的点滴,希望与大家共同成长。

观察者模式,又可被称为发布-订阅模式,反映了一种一对多的关系,当某个对象的状态变化会对多个对象造成影响,且不清楚受影响的对象数和会造成何种影响时可以考虑使用观察者模式。观察者模式可以通过委托事件来实现。举例说明,首先定义发布者类,该类中定义事件,并定义用于绑定订阅者和解除对订阅者的绑定的方法,还要定义方法对事件进行发布。然后定义一个接口,其中定义了与发布者类中事件委托类型相符的方法接口。之后可以定义订阅者类了,订阅者类要实现之前定义的接口,也就是对发布者事件对订阅者造成的具体影响进行定义。当各个订阅者之间有相似之处(有共同的数据或是方法时),可以定义一个抽象类,将各订阅者相似之处定义在该类中,并且定义与发布者类中事件委托类型相符的抽象方法,各个订阅者类要继承自这个抽象类,并具体实现其中的抽象方法。
 public interface ISubscribe
    {
        void Update(string s);
    }
    class Publisher
    {
        delegate void MyDelegate(string s);
        event MyDelegate PublishEvent;
        public void Subscrib(ISubscribe i)
        {
            PublishEvent += i.Update;
        }
        public void DeSubscrib(ISubscribe i)
        {
            PublishEvent -= i.Update;
        }
        public void Publish(string s)
        {
            if (PublishEvent != null)
            {
                PublishEvent(s);
            }
        }
    }
    class Subscrib1 : ISubscribe
    {
        string state;
        public Subscrib1(string s)
        {
            state = s;
        }
        public void Update(string s)
        {
            Console.WriteLine(state + "\r\n" + s);
        }
    }
    class Subscrib2 : ISubscribe
    {
        string state;
        public Subscrib2(string s)
        {
            state = s;
        }
        public void Update(string s)
        {
            Console.WriteLine(state + "\r\n" + s);
        }       
    }
  Publisher publisher = new Publisher();
 Subscrib1 subscrib1 = new Subscrib1("a");
            Subscrib2 subscribe2 = new Subscrib2("b");
            publisher.Subscrib(subscrib1);
            publisher.Subscrib(subscribe2);
            publisher.Publish("hello");
执行结果:
a
hello
b
hello