PartIII:2_observer 观察者模式

定义: 观察者模式

内容:
定义对象间的一种一对多的依赖关系, 当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新, 观察者模式又称 “ 发布-订阅 ” 模式;

角色:
抽象主题;
具体主题 ; 发布者;
抽象观察者;
具体观察者 concrete observer 订阅者;

@property: 属性装饰器;
负责 读取 函数中的 私有成员属性;

@company_info.setter; 
   对 私有属性 的 写;

使用场景

1.当一个抽象模型有两方面, 其中一个方面依赖于另一个方面, 将这 两者 封装在独立对象中 以使 他们可以 各自独立地改变 和 复用;

2.当对一个对象的改变 需要同时 改变其他对象, 而不知道具体有多少对象 有待改变;

3.当一个对象 必须通知 其他 对象, 而它又不能假定其他对象是谁, 换言之,你不希望这些对象是 紧密耦合的;

优点

目标和 观察者 之间的 抽象 耦合最小;
支持广播通信;

代码

底层代码

from  abc import  ABCMeta,   abstractmethod

class  Observer(metaclass = ABCMeta):  #   抽象订阅者;
    @abstractmethod
    def  update(self, notice):  # notice  是一个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 StafNotice(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

高层代码

#  clinet
notice = StafNotice("initialcompanyinfo")
s1 = Staff()
s2 = Staff()

notice.attach(s1)
notice.attach(s2)
notice.company_info = " this year company work very well, give staff awards "

print(s1.company_info)
print(s2.company_info)

notice.detach(s2)
notice.company_info = " tommorrow  will have holiday !!!"
print(s1.company_info)
print(s2.company_info)




#obj =  StafNotice('abc')
#obj.company_info = ' xyz '
#print(obj.__company_info )
#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值