HeadFirst 设计模式之观察者模式学习

温习下设计模式之观察者模式:本文参考来源:HeadFirst设计模式

题外话:HeadFirst真是深入浅出,就像看连环画,对于不爱看枯燥的文字的我非常合适,入门或快速记忆学习非常大的帮助,用此书中一个场景来说:让你犹如碰见一只饥饿的老虎,强烈刺激你的大脑皮层,让你印象深刻。

观察者模式的“教科书”(上图书中)定义:

在对象之间定义一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

UML类图如下:

观察者模式提供了一种设计,让主题和观察者之间松耦合。当两个对象之间松耦合,他们依然可以交互,但是不清楚彼此的细节。观察者模式提出了一个设计原则:为了交互对象之间的松耦合设计而努力。

C# 代码实例:

 public interface IObserver
    {
        void Update(float temperature, float humidity, float pressure);
    }
public interface ISubject
    {
        void RegisterSubject(IObserver observer);
        void RemoveSubject(IObserver observer);
        void NotifySubject();
    }
public class WeatherData : ISubject
    {
        private List<IObserver> observers = new List<IObserver>();
        private float temperature;
        private float humidity;
        private float pressure;
        public void NotifySubject()
        {
            foreach (var observer in observers)
            {
                observer.Update(temperature,humidity,pressure);
            }
        }

        public void RegisterSubject(IObserver observer)
        {
            observers.Add(observer);
        }

        public void RemoveSubject(IObserver observer)
        {
            observers.Remove(observer);
        }

        public void MeasurementsChanged()
        {
            NotifySubject();
        }

        public void SetMeasurements(float temperature, float humidity, float pressure)
        {
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            MeasurementsChanged();
        }
    }

两个具体的观察者:

public class CurrentWeatherReportor : IObserver
    {
        public CurrentWeatherReportor(ISubject subject)
        {
            subject.RegisterSubject(this);
        }

        public void Update(float temperature, float humidity, float pressure)
        {
            Console.WriteLine("[当前天气播报]>>: 气温:{0},湿度:{1}%,气压:{2}",temperature,humidity,pressure);
        }
    }

public class WeatherForecast : IObserver
    {
        public WeatherForecast(ISubject subject)
        {
            subject.RegisterSubject(this);
        }

        public void Update(float temperature, float humidity, float pressure)
        {
            Console.WriteLine("未来天气预报: 气温:{0}", temperature + 2);
        }
    }

测试:

 static void Main(string[] args)
        {
            WeatherData weather = new WeatherData();
            CurrentWeatherReportor cwr = new CurrentWeatherReportor(weather);
            WeatherForecast wf = new WeatherForecast(weather);
            weather.SetMeasurements(23, 20, 100);
            Console.ReadLine();
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值