设计模式-观察者模式

观察者模式

一、概念

   定义对象之间的一对多关系,当一个对象(状态机)发生变化时,其他所有对象(状态机)都会收到通知,并且自动更新。观察者模式也称为“发布-订阅”模式


二、角色

  • 抽象主题(Subject-被观察者):它是状态变化的源头,维护一个“观察者列表”,状态变化时通知所有注册的观察者。
  • 具体主题 (ConcreteSubject):是被观察者的具体实现,它保存状态并在状态改变时通知观察者。
  • 抽象观察者 (Observer):观察者接口,所有的具体观察者都实现该接口。当主题的状态发生变化时,观察者会收到通知并执行相应的操作。
  • 具体观察者 (ConcreteObserver):实现了观察者接口,接收被观察者发出的通知,并根据被观察者的状态作出相应的反应。


三、UML

image.png

三、具体实现



# Author: Tongqing
# Date Created: 2025/2/24
'''
    Description: 
'''
import abc
import mmap
import os

# 定义观察者接口
class ObserverInterface(abc.ABC):
    @abc.abstractmethod
    def update(self):
        pass

# 定义subject-主题接口
class SubjectInterface(abc.ABC):


    @abc.abstractmethod
    def addObserver(self, observer):
        pass

    @abc.abstractmethod
    def removeObserver(self, observer):
        pass

    @abc.abstractmethod
    def notify(self):
        pass

# 定义具体主题
class CreateSubject(SubjectInterface):
    def __init__(self):
        self.observers = []

    def addObserver(self, observer: ObserverInterface):
        self.observers.append(observer)

    def removeObserver(self, observer: ObserverInterface):
        self.observers.remove(observer)

    def notify(self):
        for observer in self.observers:
            observer.update(self)

# 定义具体observer

class CreateObserver(ObserverInterface):
    def update(self, subject: SubjectInterface):
        print(f"observer: {self} get update observer from subject: {subject}")


def main():
    subject1 = CreateSubject()
    observer1 = CreateObserver()
    subject1.addObserver(observer1)
    subject1.notify()



if __name__ == '__main__':
    main()


文章标签:

评论(0)