观察者模式

观察者模式

观察值模式:
一方发送通知,一个接受通知。接
受通知的一方称作观察值,发送通
知的一方叫做目标(subject)。
如警察埋伏小偷。小偷就是目标,他每次一露头,就会被警察发现。这样就需要警察事先知道那个人是小偷。

interface ISubject
    {
        void Add(IObserver observer);
        void Delete(IObserver observer);
        void Notify();
        string State { get; set; }
    }

    interface IObserver
    {
        void Action(string state);
    }

    class Thief:ISubject
    {
        IList<IObserver> observers;

        public Thief()
        {
            observers = new List<IObserver>();
        }

        /// <summary>
        /// 增加观察者
        /// </summary>
        /// <param name="observer"></param>
        public void Add(IObserver observer)
        {
            observers.Add(observer);
        }

        /// <summary>
        /// 删除观察者
        /// </summary>
        /// <param name="observer"></param>
        public void Delete(IObserver observer)
        {
            observers.Add(observer);
        }

        /// <summary>
        /// 发送通知
        /// </summary>
        public void Notify()
        {
            foreach (var item in observers)
            {
                item.Action(this.State);
            }
        }

        private string state=string.Empty;
        public string State
        {
            get
            {
                return state;
            }
            set
            {
                state = value;
            }
        }
    }

    class Police1:IObserver
    {
        /// <summary>
        /// 收到通知的行动
        /// </summary>
        /// <param name="state">通知的内容</param>
        public void Action(string state)
        {
            if (state=="thief")
            {
                //抓小偷
                Console.WriteLine("抓小偷");
            }
            else
            {
                //继续观察 
            }
        }
    }

    class TestObserver
    {
        public void Run()
        {
            ISubject thief1 = new Thief();

            IObserver p1 = new Police1();
            thief1.Add(p1);
            thief1.State = "thief";
            thief1.Notify();
        }
    }

 观察者解决的问题是两边的耦合关系,使得他们都依赖于抽象,一边的变化不会影响另一边。

posted @ 2013-07-11 11:12  viola  阅读(217)  评论(0编辑  收藏  举报