观察者模式案例——Publish/Subscribe

在这里插入图片描述

抽象通知者

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublishOrSubscribe_Model
{
    //抽象通知者类
    interface Subject
    {
        void Attach(Observer observer);
        void Detach(Observer observer);
        void Notify();
        string SubjectState
        {
            get;
            set;
        }
    }
}

老板

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublishOrSubscribe_Model
{
    class Boss : Subject
    {
        //同事列表
        private IList<Observer> observers = new List<Observer>();
        private string action;
        //增加
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }
        //减少
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }
        //通知
        public void Notify()
        {
            foreach (Observer o in observers)
            {
                o.Update();
            }
        }
        //老板状态
        public string SubjectState
        {
            get
            {
                return action;
            }
            set
            {
                this.action = value;
            }
        }
    }
}

秘书

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublishOrSubscribe_Model
{
    class Secretary : Subject
    {
        private IList<Observer> observers = new List<Observer>();
        private string action;
        //增加
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }
        //减少
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }
        //通知
        public void Notify()
        {
            foreach (Observer o in observers)
            {
                o.Update();
            }
        }
        //秘书状态
        public string SubjectState
        {
            get
            {
                return action;
            }
            set
            {
                this.action = value;
            }
        }
    }
}

抽象观察者

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublishOrSubscribe_Model
{
    //抽象观察者
    abstract class Observer
    {
        protected string name;
        protected Subject sub;
        
        public Observer( string name,Subject sub)
        {
            this.name = name;
            this.sub = sub;
        }
        public abstract void Update();
    }
}

股票观察者

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublishOrSubscribe_Model
{
    //股票观察者
    class StockObserver : Observer
    {
        public StockObserver(string name,Subject sub) : base(name,sub)
        {

        }
        public override void Update()
        {
            Console.WriteLine("{0} {1} 关闭股票行情!继续工作!",sub.SubjectState,name);
        }
    }
}

NBA观察者

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublishOrSubscribe_Model
{
    class NBAObserver : Observer
    {
        public NBAObserver(string name, Subject sub) : base(name, sub)
        {
            
        }
        public override void Update()
        {
            Console.WriteLine("{0} {1} 关闭NBA直播! 继续工作!",sub.SubjectState, name);
        }
    }
}

客户端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublishOrSubscribe_Model
{
    class Program
    {
        static void Main(string[] args)
        {
            Secretary secretary = new Secretary();

            StockObserver stockObserver = new StockObserver("强爸爸", secretary);
            NBAObserver nbaObserver = new NBAObserver("强爷爷", secretary);
            secretary.Attach(stockObserver);
            secretary.Attach(nbaObserver);
            secretary.SubjectState = "老板回来了!!!";
            secretary.Notify();

            Console.ReadKey();
        }
    }
}

原创文章 37 获赞 11 访问量 2777

猜你喜欢

转载自blog.csdn.net/qq_39691716/article/details/104173603
今日推荐