• python面试题——设计模式之观察者模式


    在这里插入图片描述

    1、观察者模式

    观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

    观察者模式又称:"发布-订阅"模式。

    比如,微信公众号,就是一种观察者模式的应用:
    一个公众号对应了多个(N)个 订阅者,公众号发布了新的文章,所有的订阅者都会被通知并更新。
    也就相当于,我们所有的订阅者就是观察者,我们观察这个公众号(发布者),他一更新,我们就能知道.

    在这里插入图片描述
    在这里插入图片描述

    2、哪些情况下适用于观察者模式:

    当一个抽象模型有两个方面,其中一个方面的操作依赖于另外一个方面的状态变化。
    如果在更改一个对象的时候,需要同时连带改变其他的对象,而且不知道究竟应该有多少对象需要被连带改变
    当一个对象必须通知其他对象,但是你又希望这个对象和其他被通知对象是松耦合的。

    3、观察者模式的角色(使用我们前面学习的抽象基类):

    抽象的发布者(Subject)
    具体的发布者(ConcreteSubject)
    抽象的观察者(Observer)
    具体的观察者(ConcreteObserver)

    4、观察者模式的结构

    在这里插入图片描述

    5、代码实现

    from abc import ABC,abstractmethod
    
    #抽象的观察者(抽象基类)
    class Observer(ABC):
        @abstractmethod
        def update(self,subject):
            pass
    
    
    #抽象的发布者
    class Subject(ABC):
    
        def __init__(self):
            self.observer_list=[]
    
        #抽象方法,添加观察者
        @abstractmethod
        def attach(self,obs):
            pass
    
        # 抽象方法,移除观察者
        @abstractmethod
        def detach(self, obs):
            pass
    
        # 抽象方法,通知观察者
        @abstractmethod
        def notify(self,abs):
            pass
    
    #具体的发布者
    class ConcreteSubject(Subject):
        def __init__(self,name):
            super().__init__()
            self.name = name
            #新文章
            self.new_text=''
    
        #具体的添加观察者方法
        def attach(self,obs):
            self.observer_list.append(obs)
    
        # 具体的移除观察者方法
        def detach(self, obs):
            pass
    
        # 具体的通知观察者方法(通知所有的观察者)
        def notify(self):
            for obs in self.observer_list:
                obs.update(self)
    
        #写文章的方法
        def write_text(self,text):
            self.new_text=text
            self.notify()
    
    
    #具体的观察者(订阅者)
    class ConcreteObserver(Observer):
        def __init__(self,name):
            self.name=name
            self.read_list=[]
    
        def update(self, subject):
            self.read_list.append( {'公众号': subject.name, '文章': subject.new_text} )
            print(self.name, '您有新的公众号推送', '\n', self.read_list)
    
    
    
    
    # 实例化一个 发布者
    aMen = ConcreteSubject('阿门')
    # 实例化 2个 具体的订阅者(观察者, 微信用户)
    zhangsan = ConcreteObserver('张三')
    lisi = ConcreteObserver('李四')
    # 发布者添加 订阅者(观察者)
    aMen.attach(zhangsan)
    aMen.attach(lisi)
    # 阿门公众号 更新文章
    aMen.write_text('云中歌')
    # 实例化另一个公众号
    erGeng = ConcreteSubject('二更')
    erGeng.attach(zhangsan)
    erGeng.attach(lisi)
    erGeng.write_text('发现身边不知道的美')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    执行结果:
    张三 您有新的公众号推送
    [{‘公众号’: ‘阿门’, ‘文章’: ‘云中歌’}]
    李四 您有新的公众号推送
    [{‘公众号’: ‘阿门’, ‘文章’: ‘云中歌’}]
    张三 您有新的公众号推送
    [{‘公众号’: ‘阿门’, ‘文章’: ‘云中歌’}, {‘公众号’: ‘二更’, ‘文章’: ‘发现身边不知道的美’}]
    李四 您有新的公众号推送
    [{‘公众号’: ‘阿门’, ‘文章’: ‘云中歌’}, {‘公众号’: ‘二更’, ‘文章’: ‘发现身边不知道的美’}]

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    职业技术认证:《研发效能(DevOps)工程师》——开启职业发展新篇章
    提示词优化的自动化探索:Automated Prompt Engineering
    C++之operator()和构造函数区别与总结(二百三十)
    电脑QQ如何录制视频文件?
    Python库学习(十二):数据分析Pandas[下篇]
    Java程序输入、输出、动态数组、列表、类型转换、字符串遍历
    【汇编】其他转移指令、call指令和ret指令
    SpirngBoot+微服务SpringCloud——Eureka服务的注册(二)
    NPS:使用 Windows NPS Server 部署 802.1X 无线认证(3)
    百度实习后端开发一二三面
  • 原文地址:https://blog.csdn.net/YZL40514131/article/details/126415509