观察者模式Observer Pattern

来源:互联网 发布:dns默认端口 编辑:程序博客网 时间:2024/06/07 09:44



//枚举类

public enum State
{
    Game,
    NonGame
}

//抽象的目标
namespace DesignParttern.CS.ObserverPattern
{
     abstract class Subject
    {
        protected List<Observer> observers;
        public Subject()
        {
            observers = new List<Observer>();
        }
        public void _Attach(Observer obs)
        {
            observers.Add(obs);
        }
        public void _Detach(Observer obs)
        {
            observers.Remove(obs);
        }
        public void _Notify()
        {
            foreach (var obs in observers)
            {
                obs.update();
            }
        }
    }

//具体的目标

    class ConcreteSubject : Subject
    {
        public ConcreteSubject()
        {
            m_subjectState = State.NonGame;
        }


        private State m_subjectState;
        public State m_SubjectState
        {
            get { return m_subjectState; }
            set { m_subjectState = value; Console.WriteLine("触发修改状态为"+value); }
        }
        public State _GetState()
        {
            return m_subjectState;
        }
    }


}

//抽象的接口

interface  Observer
    {
        void update();
    }

//具体的观察者

class ConcreteObserver2 : Observer
    {
        private State m_observerState;
        public ConcreteSubject m_subject;
        //注册你要监听的对象
        public ConcreteObserver2(ConcreteSubject subject)
        {
            m_subject = subject;
        }
        public void update()
        {
            m_observerState = m_subject._GetState();
            if (m_observerState == State.NonGame)
            {
                Console.WriteLine("路比较平稳,新司机开车");
            }
            else
            {
                Console.WriteLine("太刺激了,新司机下车");
            }
        }
    }

如何讲观察者和目标绑定在一起

有两种注册的方式,一种是直接在具体类构造方法中指定:我目前使用这一种 ,如

public ConcreteObserver(ConcreteSubject subject)
        {
            m_subject = subject;
        }

这样我们可以这样调用

ConcreteSubject gameState = new ConcreteSubject();

ConcreteObserver letter3 = new ConcreteObserver(gameState);

第二种:就是在父类中声明,这样就可以在父类中直接指定了,这里只是一种思路,目前还认为这一种不太好,等将来有缘再完善吧

原创粉丝点击