ObserverPattern-观察者模式

ZHIZRL / 2023-08-23 / 原文

在C#中,观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听并收到目标对象的状态变化通知。当目标对象的状态变化时,它会自动通知所有的观察者对象,使得它们能够及时更新自己。

观察者模式中有以下几个关键角色:

Subject(主题):定义了被观察的对象接口,包括添加、删除、通知观察者等方法。

ConcreteSubject(具体主题):实现了Subject接口,维护了观察者对象的列表,并在状态变化时通知观察者。

Observer(观察者):定义了观察者的接口,包括更新状态的方法。

ConcreteObserver(具体观察者):实现了Observer接口,具体实现观察者的更新方法。

下面是一个示例,展示如何在C#中使用观察者模式实现一个简单的天气观察系统:

namespace ObserverPattern_观察者模式
{
    internal class Program
    {
        // Subject
        public interface IWeatherSubject
        {
            void RegisterObserver(IWeatherObserver observer);
            void RemoveObserver(IWeatherObserver observer);
            void NotifyObservers();
        }

        // ConcreteSubject
        public class WeatherData : IWeatherSubject
        {
            private float _temperature;
            private float _humidity;
            private float _pressure;
            private List<IWeatherObserver> _observers = new List<IWeatherObserver>();
            public float Temperature
            {
                get { return _temperature; }
                set { _temperature = value; }
            }
            public float Humidity
            {
                get { return _humidity; }
                set { _humidity = value; }
            }
            public float Pressure
            {
                get { return _pressure; }
                set { _pressure = value; }
            }
            public void RegisterObserver(IWeatherObserver observer)
            {
                _observers.Add(observer);
            }
            public void RemoveObserver(IWeatherObserver observer)
            {
                _observers.Remove(observer);
            }
            public void NotifyObservers()
            {
                foreach (var observer in _observers)
                {
                    observer.Update(Temperature, Humidity, Pressure);
                }
            }

            public void MeasurementsChanged()
            {
                NotifyObservers();
            }
        }
        // Observer
        public interface IWeatherObserver
        {
            void Update(float temperature, float humidity, float pressure);
        }
        // ConcreteObserver
        public class Display : IWeatherObserver
        {
            public void Update(float temperature, float humidity, float pressure)
            {
                Console.WriteLine("Temperature: " + temperature);
                Console.WriteLine("Humidity: " + humidity);
                Console.WriteLine("Pressure: " + pressure);
            }
        }
        static void Main(string[] args)
        {
            WeatherData weatherData = new WeatherData();
            Display display = new Display();

            weatherData.RegisterObserver(display);

            weatherData.Temperature = 29.5f;
            weatherData.Humidity = 60.0f;
            weatherData.Pressure = 1013.0f;
            weatherData.MeasurementsChanged();

            Console.Read();

            // Output:
            // Temperature: 29.5
            // Humidity: 60
            // Pressure: 1013
        }
    }
}

在上述示例中,使用观察者模式实现了一个天气观察系统。IWeatherSubject是主题接口,定义了注册、删除和通知观察者的方法。WeatherData是具体主题,实现了主题接口,并维护了观察者列表,当天气数据发生变化时,通过NotifyObservers方法通知观察者。IWeatherObserver是观察者接口,定义了观察者的更新方法。Display是具体观察者,实现了观察者接口,具体实现了更新方法。

在Client中,首先创建了WeatherData和Display对象。然后通过RegisterObserver方法将Display对象注册为观察者。接着设置天气数据的温度、湿度和气压,并通过MeasurementsChanged方法通知观察者。Display对象收到通知后会更新天气信息并输出。

观察者模式的优点是实现了松耦合的对象之间的交互,当主题对象的状态发生变化时,观察者对象会自动接收到更新通知。观察者模式可以使主题对象和观察者对象之间的关系动态地建立和解除,方便系统的维护和扩展。同时,观察者模式也符合开闭原则,主题和观察者可以独立变化,互不影响。