码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式-观察者模式

时间:2020-03-19 16:37:42      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:containe   col   expand   执行   app   表示   abstract   init   变化   

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

观察者模式

首先在了解观察者模式的前提下,需要了解一个模块--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 来参加我的宴会

 

设计模式-观察者模式

标签:containe   col   expand   执行   app   表示   abstract   init   变化   

原文地址:https://www.cnblogs.com/su-sir/p/12525079.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!