设计模式-21.中介者模式

147 阅读1分钟

一句话总结

用一个中介对象封装一系列对象交互。中介者使各对象不会显示的相互引用,从而使各对象耦合松散,而且可以独立的改变它们的交互。

中介者模式示例代码

static func main() {
    let concreteMediator = ConcreteMediator()
    let c1 = ConcreteColleague1(mediator: concreteMediator)
    let c2 = ConcreteColleague2(mediator: concreteMediator)

    concreteMediator.colleague1 = c1
    concreteMediator.colleague2 = c2

    c1.send(message: "你吃饭了么?")
    c2.send(message: "没有,你打算请客?")
}

//抽象中介者
protocol Mediator {
    func send(message: String, colleague: Colleague)
}

//抽象同事
protocol Colleague {
    var mediator: Mediator { set get }
}

class ConcreteMediator: Mediator {
    var colleague1: ConcreteColleague1?
    var colleague2: ConcreteColleague2?

    func send(message: String, colleague: Colleague) {
        if colleague is ConcreteColleague1 {
            colleague2?.notify(message: message)
        } else {
            colleague1?.notify(message: message)
        }
    }
}

class ConcreteColleague1: Colleague {
    var mediator: Mediator

    init(mediator: Mediator) {
        self.mediator = mediator
    }

    func send(message: String) {
        mediator.send(message: message, colleague: self)
    }

    func notify(message: String) {
        print("同事1得到消息:\(message)")
    }
}

class ConcreteColleague2: Colleague {
    var mediator: Mediator

    init(mediator: Mediator) {
        self.mediator = mediator
    }

    func send(message: String) {
        mediator.send(message: message, colleague: self)
    }

    func notify(message: String) {
        print("同事2得到消息:\(message)")
    }
}

中介者模式优点

  • 中介者类的出现,减少了其它类与类之间的耦合
  • 把各对象如何协作进行了抽象,从看待对象本身行为转移到关注对象的交互上,更宏观的角度去看待系统

中介者模式缺点

  • 由于各对象的交互都放在中介者类中,当对象多时,中介者类中的代码也会越来越复杂