• 设计模式之观察者模式


    定义

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

    观察者模式的结构

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

    • 主题(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)架构:模型的变化需要通知视图更新。
    • 订阅-发布系统:实现发布者和订阅者之间的松耦合。

    总结

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

  • 相关阅读:
    Stable Diffusion AI绘图使用记录
    使用U盘安装openSUSE-Leap-15.4-DVD-x86_64
    11、Python 闭包实现原理
    《Docker 简易速速上手小册》第10章 朝着 Docker Swarm 和 Kubernetes 迈进(2024 最新版)
    Leetcode(146)——LRU 缓存
    TCP 要“凉“,UDP 要崛起 !
    python利用matplotlib画实验图
    mac flutter pb解析报错:protoc-gen-dart: program not found or is not executable
    PC_浮点数加减运算
    深入理解迪米特法则(Law Of Demeter)
  • 原文地址:https://blog.csdn.net/qq_47012987/article/details/140413690