设计模式-观察者模式

Posted su-sir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-观察者模式相关的知识,希望对你有一定的参考价值。

前言:当工程师和建筑师决定建造一座桥、一座塔或一栋楼时,他们会遵循一定的原则,确保其结构的完整性,现在已经有很多的可行的桥梁设计方案,根据这些方案来处理实际问题。在软件中也是如此,通过使用不同的设计模式来解决各种普遍性的问题。

观察者模式

首先在了解观察者模式的前提下,需要了解一个模块--abc

  • 可以使用abc来创建:”抽象方法“@abstractmethod 和”抽象属性“@abstractproperty

  • 抽象方法:表示可以不实现基类的一个方法,基类不能实例化,只有子类实现了该抽象方法才能被实例化。

from abc import ABC, abstractmethod


class Foo(ABC):
    @abstractmethod
    def fun(self):
        ‘‘‘抽象方法,这里可以不用实现这个方法‘‘‘


class SubFoo1(Foo):  # 如果想子类实例化,就必须先实现基类的抽象方法,否则会报错
    pass


class SubFoo2(Foo):  # 这个方法就实现了基类的抽象方法,可以正常的实例化
    def fun(self):
        print(fun in SubFoo2)

s1 = SubFoo1()
结果:
TypeError: Cant instantiate abstract class SubFoo1 with abstract methods fun
    类型错误:不能用抽象方法实例化抽象类SubFoo1

s2 = SubFool2()
s2.func()
结果:
fun in SubFoo2 (打印执行的内容)

观察者设计模式的代码逻辑

  假如通知朋友来参加宴会为例子,使用观察者的设计模式来实现:当主题发生变化时,通过实现通知方法来告知观察者

from abc import ABC, abstractmethod


class Subject:

    def __init__(self):
        self.employees = []

    def add_employees(self, employee):
        self.employees.append(employee)

    def notice_all(self, message):
        for employee in self.employees:
            employee.notice(self, message)


class Person(ABC):
    @abstractmethod
    def notice(self, subject, message):
        """通知事件,抽象化"""


class Friend1(Person):
    def notice(self, subject, message):
        print("{}收到{}的消息:{}".format(type(self).__name__, type(subject).__name__, message))


class Friend2(Person):
    def notice(self, subject, message):
        print("{}收到{}的消息:{}".format(type(self).__name__, type(subject).__name__, message))


subject = Subject()
p1 = Friend1()
p2 = Friend2()
subject.add_employees(p1)
subject.add_employees(p2)
subject.notice_all("通知晚上7:00 来参加我的生日宴会") # 当主题发生了变化,对应的观察者也会收到消息

结果:

Friend1收到Subject的消息:通知晚上7:00 来参加我的宴会
Friend2收到Subject的消息:通知晚上7:00 来参加我的宴会

 

以上是关于设计模式-观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式

未调用 LiveData 观察者

设计模式之美(c++)-笔记-56-观察者模式

设计模式之美(c++)-笔记-56-观察者模式