中介者模式
模式定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
模式结构:
- Mediator: 抽象中介者,定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信,一般包括一个或几个抽象的事件方法,并由子类去实现。
- ConcreteMediator: 具体中介者,从抽象中介者继承而来,实现抽象中介者中定义的事件方法
- Colleague: 抽象同事类
- ConcreteColleague: 具体同事类
实例:聊天室,聊天成员
感觉有点拗口的地方,需要聊天室加入所有成员,成员也需要传入聊天室实例。
from abc import ABCMeta, abstractmethod class Mediator(metaclass=ABCMeta): """ 抽象中介 聊天室 """ def __init__(self): self._members = [] def register_member(self,member): self._members.append(member) @abstractmethod def operation(self,name,msg): """具体操作""" class ChatRoom(Mediator): """ 具体中介 聊天室 """ def operation(self,name,msg): for i in self._members: i.get_msg(name,msg) class Colleague(metaclass=ABCMeta): """ 抽象同事 聊天同事 """ def __init__(self,name): self._name = name self._mediator = None def set_mediator(self,mediatorObj): self._mediator = mediatorObj @abstractmethod def send_msg(self,msg): """""" @abstractmethod def get_msg(self,name,msg): """""" class ChatMember(Colleague): """ 具体同事 聊天成员 """ def send_msg(self,msg): """""" self._mediator.operation(self._name,msg) def get_msg(self,name,msg): """""" print("%s收到chatroom[%s]的message[%s]"%(self._name,name,msg)) if __name__ == "__main__": chatroom = ChatRoom() memb1 = ChatMember("Bob") memb2 = ChatMember("John") chatroom.register_member(memb1) chatroom.register_member(memb2) memb1.set_mediator(chatroom) memb2.set_mediator(chatroom) memb1.send_msg("hello world")