C#设计模式之《观察者模式》

1、首先定义两个接口,一个用于观察者(Observer),一个用于被观察者(Subject)

    public interface ISubject
    {
        void RegisterObserver(IObserverObj o);
        void RemoveObserver(IObserverObj o);
        void NotifyableObserver();
    }

    public interface IObserverObj
    {
        void Update(double temp, double humidity, double pressure);
    }

2、观察者和被观察者分别实现这两个接口

    public class ObserverUser:IObserverObj
    {
        private double _temp;
        private double _humidity;
        private double _pressure;

        public void Update(double temp, double humidity, double pressure)
        {
            _temp = temp;
            _humidity = humidity;
            _pressure = pressure;
            Console.WriteLine(string.Join("\t", temp.ToString(), humidity.ToString(), pressure.ToString()));
        }
    }

    public class WeatherData : ISubject
    {
        private double _temp;
        private double _humidity;
        private double _pressure;
        private IList<IObserverObj> _observerList;

        public WeatherData()
        {
            _observerList = new List<IObserverObj>();
        }

        public void RegisterObserver(IObserverObj o)
        {
            _observerList.Add(o);
        }

        public void RemoveObserver(IObserverObj o)
        {
            _observerList.Remove(o);
        }

        public void NotifyableObserver()
        {
            foreach (var observer in _observerList)
            {
                observer.Update(_temp, _humidity, _pressure);
            }
        }

        public void SetWeatherData(double temp, double humidity, double pressure)
        {
            _temp = temp;
            _humidity = temp;
            _pressure = pressure;
            NotifyableObserver();
        }
    }

这里写了两个类,一个是气象台,它是Subject,用于被别人观察;一个是观察者ObserverUser,它观察这个Subject。当当Subject的数据改变的时候就通知所有观察他的对象。怎么观察他呢?就是通过注册的方式,注册了就说明观察他了,然后当Subject的数据改变的时候就会通知到它;如果不想观察了就取消注册,到时候自然就不会通知它了。
3、最后模拟一下当注册、取消注册、通知观察者的代码:

static void Main(string[] args)
        {
            var oberver1 = new ObserverUser();
            var oberver2 = new ObserverUser();
            var oberver3 = new ObserverUser();
            var subj = new WeatherData();

            subj.RegisterObserver(oberver1);
            subj.RegisterObserver(oberver2);
            subj.RegisterObserver(oberver3);
            subj.SetWeatherData(12.15, 24.5, 33.45);

            subj.RemoveObserver(oberver3);
            subj.SetWeatherData(0, 0.85, 33.45);

            Console.ReadLine();
        }

观察者模式的思想就是这样子的。此外,可以在构造Observer对象的时候,传入一个Subject对象的引用,到时候就可以直接到Observer对象中就可以取值注册。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值