设计模式-行为型模式,观察者模式(13)

Posted 北风之神0509

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-行为型模式,观察者模式(13)相关的知识,希望对你有一定的参考价值。

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

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

 

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)

    @property
    def data(self):
        return self._data

    @data.setter
    def data(self, new_value):
        try:
            self._data = int(new_value)
        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.remove(hf)
    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()

 

以上是关于设计模式-行为型模式,观察者模式(13)的主要内容,如果未能解决你的问题,请参考以下文章

23种设计模式归纳总结——行为型

23种设计模式归纳总结——行为型

23种设计模式归纳总结——行为型

设计模式(行为型-观察者模式)

初探Java设计模式3:行为型模式(策略,观察者等)

Python 设计模式 — 行为型模式 — 观察者模式