// 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!
// 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!