设计模式之观察者模式

定义

观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。

观察者模式的结构

观察者模式涉及以下几个关键角色:

  • 主题(Subject):状态发生变化的对象。它维护一组观察者,并在状态变化时通知所有观察者。
  • 观察者(Observer):依赖于主题的对象。当主题的状态变化时,观察者会被通知并进行相应的更新。

观察者模式实现

观察者接口(IObserver)

	// 观察者接口
    public interface IObserver
    {
        void Update(string message);
    }

具体观察者(ConcreteObserver )
舍友是观察者,里面实现了更新方法:

	// 具体观察者
    public class ConcreteObserver : IObserver
    {
        private string _name;
        private string _doSomething;

        public ConcreteObserver(string name,string doSomething)
        {
            _name = name;
            _doSomething = doSomething;
        }

        public void Update(string message)
        {
            Console.WriteLine($"{_name} 收到 {message},请求:{_doSomething}");
        }
    }

主题接口

	// 主题接口
    public interface ISubject
    {
    	/**
     	* 增加订阅者
     	* @param observer
     	*/
        void Attach(IObserver observer);
        /**
     	* 删除订阅者
     	* @param observer
     	*/
        void Detach(IObserver observer);
        /**
     	* 通知订阅者更新消息
     	*/
        void Notify(String message);
    }

具体主题实现

	// 具体主题
    public class ConcreteSubject : ISubject
    {
    	//储存订阅主题用户
        private List<IObserver> _observers = new List<IObserver>();
		
		//宿舍长下楼了
        public void DownStairs()
        {
        	Console.WriteLine("我要下楼了!");
             Notify("宿舍长要下楼了");
        }

        public void Attach(IObserver observer)
        {
            _observers.Add(observer);
        }

        public void Detach(IObserver observer)
        {
            _observers.Remove(observer);
        }

        public void Notify(string message)
        {
            foreach (var observer in _observers)
            {
                observer.Update(message);
            }
        }
    }

客户端调用

class Program
    {
        static void Main(string[] args)
        {
        	//创建主题宿舍长的行踪
            ConcreteSubject subject = new ConcreteSubject();
			//创建订阅者舍友A
            ConcreteObserver observer1 = new ConcreteObserver("李炎","帮我带饭");
            //创建订阅者舍友B
            ConcreteObserver observer2 = new ConcreteObserver("张力","帮我买瓶水");
			//订阅宿舍长的行踪
            subject.Attach(observer1);
            subject.Attach(observer2);
            //宿舍长下楼了
			subject.DownStairs();
        }
    }

结果

我要下楼了!
李炎收到宿舍长要下楼了,请求帮忙带饭
张力收到宿舍长要下楼了,请求帮忙买瓶水

观察者模式的优缺点

优点

  • 松耦合:观察者模式实现了对象之间的松耦合,观察者和主题之间没有直接的依赖关系。
  • 可扩展性:可以动态地增加和删除观察者,无需修改主题的代码。
  • 灵活性:可以实现广播通信,主题可以通知多个观察者。

缺点

  • 性能开销:如果观察者较多,通知所有观察者可能会影响性能。
  • 内存泄漏:如果观察者没有被正确移除,可能会导致内存泄漏。
  • 复杂性增加:对于复杂的观察者和主题关系,管理起来会比较复杂。

适用场景

  • 事件驱动系统:例如GUI应用中的事件处理系统。
  • 模型-视图-控制器(MVC)架构:模型的变化需要通知视图更新。
  • 订阅-发布系统:实现发布者和订阅者之间的松耦合。

总结

观察者模式通过定义一对多的依赖关系,使得对象之间的通信变得更加灵活和松耦合。通过接口和具体类的实现,可以实现动态的观察者管理和事件通知。

相关推荐

  1. 【前端设计模式观察模式

    2024-07-14 13:06:02       54 阅读
  2. 设计模式观察模式

    2024-07-14 13:06:02       50 阅读
  3. 设计模式观察模式

    2024-07-14 13:06:02       53 阅读
  4. 设计模式观察模式

    2024-07-14 13:06:02       49 阅读
  5. go 设计模式观察模式

    2024-07-14 13:06:02       49 阅读
  6. 设计模式观察模式

    2024-07-14 13:06:02       49 阅读
  7. C++ 设计模式观察模式

    2024-07-14 13:06:02       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 13:06:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 13:06:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 13:06:02       57 阅读
  4. Python语言-面向对象

    2024-07-14 13:06:02       68 阅读

热门阅读

  1. VUE export import

    2024-07-14 13:06:02       20 阅读
  2. 数据结构——复杂度

    2024-07-14 13:06:02       27 阅读
  3. 【Rust】——不安全Rust

    2024-07-14 13:06:02       22 阅读
  4. Jupyter Notebook 安装教程

    2024-07-14 13:06:02       21 阅读