Administrator
发布于 2024-08-01 / 16 阅读
0
0

观察者模式

问题描述

公司几个同时上班摸鱼,比如又看NBA的,有炒股的。如果老板回来了,前台小妹会给大家发消息,大家立刻开始工作。

代码实现

Subject接口

    public interface Subject
    {
        void attach(Observer observer);
        void detach(Observer observer);
        void notify();

        string GetSubjectState();
    }

订阅者抽象类

    public abstract class Observer
    {
        protected string mName;
        protected Subject mSub;
        public Observer(string name, Subject sub)
        {
            mName = name;
            mSub = sub;
        }

        public abstract void update();
    }

具体Subject类

    public class Boss : Subject
    {
        private List<Observer>mObservers = new List<Observer>();
        private string action;
        public void attach(Observer observer)
        {
            mObservers.Add(observer);
        }

        public void detach(Observer observer)
        {
            mObservers.Remove(observer);
        }

        public string GetSubjectState()
        {
            return action;
        }

        public void notify()
        {
            foreach(var observer in mObservers)
                observer.update();
        }

        public void SetSubjectState(string state)
        {
            this.action = state;
        }
    }

订阅者实现类

    public class NBAObserver : Observer
    {
        public NBAObserver(string name, Subject subject) : base(name, subject) { }
        public override void update()
        {
            Console.WriteLine($"{mSub.GetSubjectState()} {mName} 关闭直播,开始工作");
        }
    }

    public class StockObserver : Observer
    {
        public StockObserver(string name, Subject sub) : base(name, sub)
        {
        }

        public override void update()
        {
            Console.WriteLine($"{mSub.GetSubjectState()} {mName} 关闭股票行情,开始工作");
        }
    }

运行结果

老板回来了 职工2 关闭股票行情,开始工作

UML图

疑问点:

  • 为什么Subject的接口attach、detach、notify暴露在外?这样的话,Observer的Subject 成员也可以调用这些接口。但是实际上Observer的Subject成员不应该调用这些接口。


评论