行為型模式--中介者模式

 

用於封装一系列同事对象交互通信之中間媒介,此模式可使各同事对象不需要以显式直接作交互作用,从而使其達到解耦之目的,并可容易日後來改变它们之间的交互,一般应用於一组同事对象已被良好定义但須以复杂方式來进行交互通信之场合中。

类图

示例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

Import abc
class Mediator(object):           #中介者抽象基类

@abc.abstractmethod
    def send(self,message,colleague):           #轉介交互訊息給colleague
        raise NotImplementedError

class ConcreteMediator(Mediator):  #中介者具体类
    def __init__(self):
        self.colleague1 = ""
        self.colleague2 = ""


    def send(self,message,colleague):
        if self.colleague1 == colleague:
            self.colleague2.get_message(message)
        elif self.colleague2 == colleague:
            self.colleague1.get_message(message)
        else:
            print('無同事对象可處理')


class Colleague(object):       #同事基类
    def __init__(self):
        self.mediator = ""

    def bind(self,mediator):
        self.mediator = mediator

class Colleague1(Colleague):        #同事具体子类1
    def send(self, message):
        self.mediator.send(message,self)      #此self傳參是指定本類給colleague

    def get_message(self,message):
        print("同事类1接收訊息:",message)

class Colleague2(Colleague):        #同事具体子类2
    def send(self, message):
        self.mediator.send(message,self)

    def get_message(self,message):
        print("同事类2接收訊息:",message)
#實際業務邏輯之場景如下:
if __name__ == "__main__":
    # 创建同事及中介者具体类
    c1 = Colleague1()
    c2 = Colleague2()
    cm = ConcreteMediator()
    #交互者绑定中介者
    c1.bind(cm)
    c2.bind(cm)

    cm.colleague1 = c1
    cm.colleague2 = c2

    #对象交互
    c1.send('由同事类1發佈訊息')
    c2.send('由同事类2發佈訊息')

輸出:

同事类2接收訊息: 由同事类1發佈訊息

同事类1接收訊息: 由同事类2發佈訊息

總結

优点:

  • 减少對象間之依赖以降低耦合程度
  • 容易扩展對象规模。

缺点

  • 當處理對象眾多則會造成中介者对象本身的复杂性会很龐大,且其轉介處理之逻辑会變得很复杂。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值