python 设计模式-中介者模式

mac2022-06-30  28

中介者主要用于对多对象交互进行解耦,所有对象相互之间不直接联系,所有事情都是通过中介者来操作。看下面代码:

#!/usr/bin/env python #coding: utf-8 from abc import ABCMeta, abstractmethod, abstractproperty class Mediator(metaclass=ABCMeta): @abstractproperty def colleague_a(self): pass @abstractproperty def colleague_b(self): pass @abstractmethod def notify(colleague, data): pass class ConcreteMediator(Mediator): @property def colleague_a(self): return self._colleague_a @colleague_a.setter def colleague_a(self, val): self._colleague_a = val @property def colleague_b(self): return self._colleague_b @colleague_b.setter def colleague_b(self, val): self._colleague_b = val def notify(self, colleague, data): if isinstance(colleague, ColleagueA): self._colleague_b.data_a = data elif isinstance(colleague, ColleagueB): self._colleague_a.data_b = data else: pass class Colleague(metaclass=ABCMeta): def __init__(self, mediator): self._mediator = mediator @abstractmethod def exchange(self, data): pass @property def data_a(self): return self._data_a @data_a.setter def data_a(self, val): self._data_a = val @property def data_b(self): return self._data_b @data_b.setter def data_b(self, val): self._data_b = val class ColleagueA(Colleague): def exchange(self, data): self.data_a = data self._mediator.notify(self, self.data_a) class ColleagueB(Colleague): def exchange(self, data): self.data_b = data self._mediator.notify(self, self.data_b) if __name__ == '__main__': m = ConcreteMediator() ca = ColleagueA(m) cb = ColleagueB(m) m.colleague_a = ca m.colleague_b = cb ca.exchange(100) cb.exchange(200) print('ca: {}, {}, cb: {}, {}'.format(ca.data_a, ca.data_b, cb.data_a, cb.data_b))

输出:

ca: 100, 200, cb: 100, 200
最新回复(0)