设计模式

1,观察者模式

# coding: utf-8
'''
观察者模式:
内容:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知
     并被自动更新,观察者模式又称“发布-订阅”模式
角色:
     抽象主题:Subject
     具体主题:ConcreteSubject    --- 发布者
     抽象观察者:Observer
     具体观察者:ConcreteObserver   --- 订阅者
适用场景:1,当一个抽象模型有两方面,其中一个方面依赖于另一个方面,将这两者封装在独立对象中以使他们
        可以各自独立地改变和复用
        2,当对于对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
        3,当一个对象必须通知其他对象,而它又不能假定其他对象是谁,换言之,你不希望这些对象是紧密藕合的
优点:1,目标和观察者之间的抽象藕合最小
     2,支持广播通信
'''

from abc import ABCMeta, abstractmethod

class Observer(metaclass=ABCMeta):    # 抽象订阅者
    @abstractmethod
    def update(self, notice):
        pass

class Notice:     # 抽象发布者
    def __init__(self):
        self.observers = []     # 订阅者和发布者之间是松耦合,使用列表来维护

    def attach(self, obs):
        self.observers.append(obs)

    def detach(self, obs):
        self.observers.remove(obs)

    def notify(self):    # 推送
        for obs in self.observers:
            obs.update(self)

class StaffNotice(Notice):
    def __init__(self, company_info=None):
        super().__init__()
        self.__company_info = company_info

    @property
    def company_info(self):   # 读信息
        return self.__company_info

    @company_info.setter     # 写信息
    def company_info(self, info):
        self.__company_info = info
        self.notify()

class Staff(Observer):
    def __init__(self):
        self.company_info = None

    def update(self, notice):
        self.company_info = notice.company_info


notice = StaffNotice('初始公司信息')
s1 = Staff()
s2 = Staff()
notice.attach(s1)
notice.attach(s2)
notice.company_info = '信息更新'
print('S1: ', s1.company_info)
print('S2: ', s2.company_info)
notice.detach(s2)
notice.company_info = '明天放假'
print('S1: ', s1.company_info)
print('S2: ', s2.company_info)

执行结果:

S1:  信息更新
S2:  信息更新
S1:  明天放假
S2:  信息更新

 

 

 

2,单例模式   

'''
单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点。
适用场景:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
优点:
    对唯一实例的受控访问
    单例相当于全局变量,但防止了命名空间被污染

'''

class Test():
    __isinstance = None

    def __new__(cls, *args, **kwargs):
        if not Test.__isinstance:
            Test.__isinstance = Test.__Test()

        return Test.__isinstance

    def __getattr__(self, item):
        return getattr(self.__isinstance,item)

    def __setattr__(self, item):
        return setattr(self.__isinstance,item)

    class __Test():
        def __init__(self):
            print('Hello World')

t = Test()
t1 = Test()
t2 = Test()
print(t)
print(t1)
print(t2)
View Code
Hello World
<__main__.Test.__Test object at 0x000001FD57957FA0>
<__main__.Test.__Test object at 0x000001FD57957FA0>
<__main__.Test.__Test object at 0x000001FD57957FA0>
执行结果
posted @ 2022-08-31 15:16  夜未央leo  阅读(10)  评论(0编辑  收藏  举报