中介者 vs 协调者

中介者模式(Mediator Pattern)协调者模式(Coordinator Pattern) 示例代码,并展示它们的输出。

1. 中介者模式(Mediator Pattern)示例

在这个示例中,我们将实现一个简单的聊天室,中介者负责协调用户之间的消息传递。

// Mediator Protocol
protocol Mediator {
    func send(message: String, colleague: Colleague)
}

// ConcreteMediator
class ChatRoom: Mediator {
    var colleagues: [Colleague] = []

    func addColleague(_ colleague: Colleague) {
        colleagues.append(colleague)
        colleague.mediator = self
    }

    func send(message: String, colleague: Colleague) {
        for c in colleagues {
            if c !== colleague {
                c.receive(message)
            }
        }
    }
}

// Colleague Protocol
protocol Colleague {
    var mediator: Mediator? { get set }
    func send(message: String)
    func receive(_ message: String)
}

// ConcreteColleague (User)
class User: Colleague {
    var mediator: Mediator?
    let name: String

    init(name: String) {
        self.name = name
    }

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

    func receive(_ message: String) {
        print("\(name) received: \(message)")
    }
}

// Usage
let chatRoom = ChatRoom()

let user1 = User(name: "Alice")
let user2 = User(name: "Bob")
let user3 = User(name: "Charlie")

chatRoom.addColleague(user1)
chatRoom.addColleague(user2)
chatRoom.addColleague(user3)

user1.send(message: "Hello, everyone!")
user2.send(message: "Hi, Alice!")

中介者模式的输出

Bob received: Hello, everyone!
Charlie received: Hello, everyone!
Alice received: Hi, Alice!

在这个代码中,ChatRoom 作为中介者,协调不同的用户之间的消息传递。每个用户发送的消息都会被中介者转发给其他用户,而不会直接与其他用户通信。

2. 协调者模式(Coordinator Pattern)示例

在这个示例中,我们将模拟一个订单处理系统,OrderCoordinator 负责协调订单、库存和发货模块。

// Coordinator Protocol
protocol Coordinator {
    func processOrder(order: Order)
}

// Order class
class Order {
    let id: String
    var isValid: Bool

    init(id: String, isValid: Bool) {
        self.id = id
        self.isValid = isValid
    }
}

// Inventory Manager
class InventoryManager {
    func reserveStock(for order: Order) {
        print("Reserving stock for Order \(order.id)...")
    }
}

// Shipping Manager
class ShippingManager {
    func scheduleShipping(for order: Order) {
        print("Scheduling shipping for Order \(order.id)...")
    }
}

// Alert Manager
class AlertManager {
    func sendAlert(for order: Order) {
        print("Alert: Order \(order.id) is invalid!")
    }
}

// ConcreteCoordinator
class OrderCoordinator: Coordinator {
    let inventoryManager = InventoryManager()
    let shippingManager = ShippingManager()
    let alertManager = AlertManager()

    func processOrder(order: Order) {
        if order.isValid {
            inventoryManager.reserveStock(for: order)
            shippingManager.scheduleShipping(for: order)
        } else {
            alertManager.sendAlert(for: order)
        }
    }
}

// Usage
let order1 = Order(id: "12345", isValid: true)
let order2 = Order(id: "67890", isValid: false)

let coordinator = OrderCoordinator()

coordinator.processOrder(order: order1)
coordinator.processOrder(order: order2)

协调者模式的输出

Reserving stock for Order 12345...
Scheduling shipping for Order 12345...
Alert: Order 67890 is invalid!

在这个示例中,OrderCoordinator 作为协调者,负责协调订单的处理流程。当订单有效时,协调者会调用库存管理和发货管理模块;如果订单无效,协调者会通知警报模块。

总结:

  • 中介者模式 主要是将通信从直接对象之间转移到中介者对象中,通常不涉及复杂的业务逻辑,主要负责消息的传递。

  • 协调者模式 在协调多个对象的交互时,除了通信协调外,还涉及更多的业务逻辑和调度任务,例如决策、流程控制等。

Last updated