设计模式-观察者模式
Posted su-sir
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-观察者模式相关的知识,希望对你有一定的参考价值。
前言:当工程师和建筑师决定建造一座桥、一座塔或一栋楼时,他们会遵循一定的原则,确保其结构的完整性,现在已经有很多的可行的桥梁设计方案,根据这些方案来处理实际问题。在软件中也是如此,通过使用不同的设计模式来解决各种普遍性的问题。
观察者模式
-
可以使用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: Can‘t 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设计模式补充:回调模式事件监听器模式观察者模式(转)