聊聊Swift中的设计模式---行为型(中介者模式)

997 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情


前言

在面向对象的开发过程中,其实咱们或多或少的都接触过一些设计模式,可能知道或不知道其对应的名称,也不知道其具体使用场景,今天咱们就来说说几种常见的设计模式,帮助你们在开发过程中,更加得心应手。

正文

中介者模式

解释:

简单来说,如果有多个对象和类之间有通信关系,那么想要降低他们之间的耦合,就需要一个中介类,该类就是处理不同类之间的通信,并支持松耦合,使代码易于维护。

在现实世界中,飞机驾驶员们在靠近或离开机场时不会直接相互交流。 但他们塔台中的空管员通话。 如果没有空管员, 驾驶员就需要留意机场附近的所有飞机, 并与数十位飞行员组成的委员会讨论降落顺序。这样就会造成十分混乱的场景。

而塔台中的空管就相当于中介者,由它去处理起飞和落下的顺序。

下面咱们来看看一个简单的示例代码。

首先定义一个聊天者ChatUser的类

它有两个属性,一个是聊天者的名称,另一个是中介者mediator

同样这个类里面实现了发送消息和接受消息的方法。

class ChatUser {
    let name: String
    weak var mediator: ChatMediator?
    
    init(name: String, mediator: ChatMediator) {
        self.name = name
        self.mediator = mediator
    }
    
    func send(msg: String) {
        print("(name):发送消息 = (msg)")
        mediator?.sendMessage(msg: msg, user: self)
    }
    
    func receive(msg: String) {
        print("(name):收到消息:(msg)")
    }
}


然后咱们来看看中介者类如何实现的。

这个类里面定义了一个装聊天者的数组,通过函数add添加,同时也定义了一个函数sendMessage,用来将users数组中的聊天者进行筛选然后让每个聊天者实例调用receive方法,接受到消息

class ChatMediator {
    
    private var users: [ChatUser] = []
    
    func sendMessage(msg: String, user: ChatUser) {
        users.filter { (it) -> Bool in
            return it.name != user.name
        }.forEach { (it) in
            it.receive(msg: msg)
        }
    }
    
    func add(user: ChatUser) {
        self.users.append(user)
    }
}

最后咱们来看看使用和输出

let mediator = ChatMediator()
var john = ChatUser(name: "John", mediator: mediator)

mediator.add(user: ChatUser(name: "Alice", mediator: mediator))
mediator.add(user: ChatUser(name: "Bob", mediator: mediator))

john.send(msg: "Hi everyone!")
John:发送消息 = Hi everyone!
Alice:收到消息:Hi everyone!
Bob:收到消息:Hi everyone!

可以看到当john.send(msg: "Hi everyone!")发送时 AliceBob都收到了消息。

结语

中介者模式适合应用场景

  • 当一些对象和其他对象紧密耦合以致难以对其进行修改时, 可使用中介者模式。
  • 当组件因过于依赖其他组件而无法在不同应用中复用时, 可使用中介者模式。
  • 如果为了能在不同情景下复用一些基本行为, 导致你需要被迫创建大量组件子类时, 可使用中介者模式。

中介者模式优缺点

优点

  • 单一职责原则。 你可以将多个组件间的交流抽取到同一位置, 使其更易于理解和维护。

  • 开闭原则。 你无需修改实际组件就能增加新的中介者。

  • 你可以减轻应用中多个组件间的耦合情况。

  • 你可以更方便地复用各个组件。

缺点

  • 过一段时间后 可能会成为了解过多或者负责过多的对象

扩展阅读 下面还有其他模式

创建型-工厂模式

创建型-建造者模式

结构型-适配器模式

结构型-桥接模式

结构型-组合模式

结构型-装饰器模式

结构型-外观模式