您现在的位置是:首页 >学无止境 >「中介者(Mediator)」设计模式 Swift实现网站首页学无止境

「中介者(Mediator)」设计模式 Swift实现

黑码哥 2024-08-20 00:01:02
简介「中介者(Mediator)」设计模式 Swift实现

设计模式介绍

中介者设计模式(Mediator Pattern)是一种行为型设计模式,它可以促进对象之间的松耦合关系,通过集中控制这些对象之间的通信来减少对象之间的直接依赖。

在这种模式中,中介者对象充当了通信的中心枢纽,其主要的功能是将对象之间的通信转移至自身,从而使这些对象之间解耦,并且更容易维护和扩展。

具体来说,在中介者模式中,每个对象都有指向中介者对象的引用,通过调用中介者对象的方法来与其它对象进行协调和通信,而不是直接与其它对象进行交互。

下面我们用一个简单的 Swift 代码例子来阐述中介者模式的应用。

具体业务场景举例一

假设我们有一个电子竞技比赛的游戏,有两个角色分别是 PlayerA 和 PlayerB,他们之间需要进行协同作战,需要进行通信。我们可以使用中介者模式来实现:

首先,我们需要定义一个 Mediator 协议,用于规范中介者的行为:

protocol Mediator {
    func communicate(sender: Player)
}

然后,我们定义 PlayerA 和 PlayerB 两个角色类,分别继承自 Player 类,并在构造函数中将中介者对象传递进去:

class Player: NSObject {
    var mediator: Mediator
    init(mediator: Mediator) {
        self.mediator = mediator
    }
    func attack() {
        
    }
}

class PlayerA: Player {
    override init(mediator: Mediator) {
        super.init(mediator: mediator)
    }
    override func attack() {
        // 发起攻击
        mediator.communicate(sender: self)
    }
}

class PlayerB: Player {
    override init(mediator: Mediator) {
        super.init(mediator: mediator)
    }
    override func attack() {
        // 发起攻击
        mediator.communicate(sender: self)
    }
}

其中,PlayerA 和 PlayerB 都覆盖了 attack() 方法,并在其中通过中介者通信。

最后,我们定义一个 GameMediator 类,实现 Mediator 协议,并在其中实现 communicate(sender: Player) 方法,来控制角色之间的通信:

class GameMediator: Mediator {
    func communicate(sender: Player) {
        if sender is PlayerA {
            print("PlayerA 发起攻击")
            print("PlayerB 响应攻击,并进行防御")
        } else if sender is PlayerB {
            print("PlayerB 发起攻击")
            print("PlayerA 响应攻击,并进行防御")
        }
    }
}

在 GameMediator 的 communicate() 方法中,我们根据发送者的类型来实现不同的协作策略。

现在我们可以在客户端代码中实例化 GameMediator 和 PlayerA、PlayerB 对象,并进行通信:

let mediator = GameMediator()
let playerA = PlayerA(mediator: mediator)
let playerB = PlayerB(mediator: mediator)

playerA.attack()
playerB.attack()

输出结果:

PlayerA 发起攻击
PlayerB 响应攻击,并进行防御
PlayerB 发起攻击
PlayerA 响应攻击,并进行防御

在这个代码示例中,我们使用中介者模式实现了 PlayerA 和 PlayerB 之间的通信,使得他们之间解耦,并且更容易维护和扩展。

具体业务场景举例二

假设我们有一个聊天室系统,其中包含了多个用户和一个中介者聊天室对象,我们可以使用中介者模式来实现用户之间的聊天。

首先,我们定义一个 Mediator 协议,规范中介者的行为:

// 中介者协议
protocol Mediator {
    func sendMessage(message: String, sender: User)
}

// 用户协议
protocol User {
    var name: String { get }
    func sendMessage(message: String)
    func receiveMessage(message: String)
}

在这里,我们定义了一个 Mediator 协议和一个 User 协议,其中 Mediator 协议规定了 sendMessage() 方法,用于接收用户的消息并进行转发,而 User 协议规定了 sendMessage() 和 receiveMessage() 方法,分别用于发送和接收聊天消息。

然后,我们定义 ChatRoom 对象,实现 Mediator 协议,并在其中实现 sendMessage() 方法:

// 聊天室中介者类
class ChatRoom: Mediator {
    func sendMessage(message: String, sender: User) {
        for user in users {
            if user.name != sender.name {
                user.receiveMessage(message: message)
            }
        }
    }
    
    func addUser(user: User) {
        users.append(user)
    }
    
    var users: [User] = []
}

在 ChatRoom 中,我们维护了一个用户数组 users,用于存储所有加入到聊天室中的用户。sendMessage() 方法会遍历这个数组,并把消息发送给除了发送者本身以外的所有用户。

最后,我们定义 UserA 和 UserB 两个用户对象,分别实现 User 协议:

class UserA: User {
    var name: String
    var mediator: Mediator
    
    init(name: String, mediator: Mediator) {
        self.name = name
        self.mediator = mediator
    }
    
    func sendMessage(message: String) {
        mediator.sendMessage(message: "(name): (message)", sender: self)
    }
    
    func receiveMessage(message: String) {
        print("(name) 收到消息:(message)")
    }
}

class UserB: User {
    var name: String
    var mediator: Mediator
    
    init(name: String, mediator: Mediator) {
        self.name = name
        self.mediator = mediator
    }
    
    func sendMessage(message: String) {
        mediator.sendMessage(message: "(name): (message)", sender: self)
    }
    
    func receiveMessage(message: String) {
        print("(name) 收到消息:(message)")
    }
}

在 UserA 和 UserB 中,我们实现了 sendMessage() 方法和 receiveMessage() 方法,其中 sendMessage() 方法会调用中介者对象的 sendMessage() 方法,将用户发送的消息进行转发。

最后,我们可以在客户端代码中实例化 ChatRoom 对象和 UserA、UserB 对象,并进行聊天:

let chatRoom = ChatRoom()
let userA = UserA(name: "张三", mediator: chatRoom)
let userB = UserB(name: "李四", mediator: chatRoom)

chatRoom.addUser(user: userA)
chatRoom.addUser(user: userB)

userA.sendMessage(message: "你好")
userB.sendMessage(message: "你好")

输出结果:

李四 收到消息:张三: 你好
张三 收到消息:李四: 你好

这就是中介者设计模式

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。