中介者模式

模式定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

模式结构:

  • 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")

  

posted @ 2019-02-13 14:20  家迪的家  阅读(236)  评论(0编辑  收藏  举报