Python设计模式:旁观者模式

设计模式十四:旁观者模式

什么是旁观者模式

描述单个对象(发布者)与一个或多个对象(订阅者)之间的发布-订阅关系。

使用场景

希望在一个对象的状态改变时更新另外一组对象。

典型案例

拍卖会,不论出价人在何时举牌,拍卖师都会更新报价,并将新的价格广播给所有出价人。

实例代码

class Publisher: #将订阅者添加到列表中,提供添加 删除 功能

    def __init__(self):
        self.observers = []
    
    def add(self,observer):
        if observer not in self.observers:
            self.observers.append(observer)
        else:
            print('Failed to add : {}'.format(observer))
    
    def remove(self,observer):
        try:
            self.observers.remove(observer)
        except ValueError:
            print('Failed to remove : {}'.format(observer))
    
    def notify(self): # 变化发生时,通知所有观察者
        [o.notify(self) for o in self.observers]

class DefaultFormatter(Publisher):

    def __init__(self,name):
        Publisher.__init__(self) # 基类初始化
        self.name = name
        self._data = 0

    def __str__(self):
        return "{}:'{}' has data = {}".format(type(self).__name__,self.name,self._data) # type(self).__name__ 是获取类名的简便技巧

    @property   # 提供_data变量的读取访问方式,可用object.data代替object.data()
    def data(self):
        return self._data
    
    @data.setter # 每次使用赋值符(=)为_data变量赋新值时被调用
    def data(self,vaule):
        try:
            self._data = int(vaule)
        except ValueError as e:
            print('Error:{}'.format(e))
        else:
            self.notify()

class HexFormatter:
    def notify(self,publisher):
        print("{}:'{}' has now hex data = {}".format(type(self).__name__,publisher.name,hex(publisher.data)))

class BinaryFormatter:
    def notify(self,publisher):
        print("{}:'{}' has now bin data = {}".format(type(self).__name__,publisher.name,bin(publisher.data)))

def main():
    df = DefaultFormatter('test1')
    print(df)
    print()
    hf = HexFormatter()
    df.add(hf)
    df.data = 3
    print(df)
    print()
    bf = BinaryFormatter()
    df.add(bf)
    df.data = 21
    print(df)
    print()
    df.data = 40
    print(df)
    print()
    df.remove(hf)
    df.add(bf)
    df.data = 'hello'
    print(df)
    print()
    df.data = 15.8
    print(df)

if __name__ == "__main__":
    main()
发布了22 篇原创文章 · 获赞 2 · 访问量 1043

猜你喜欢

转载自blog.csdn.net/youngdianfeng/article/details/104075818
今日推荐