命令模式(Command Pattern)是一种行为型设计模式,它将请求或操作封装成一个对象,从而允许你将请求的发>送者(调用者)与请求的接收者解耦。这个模式通常涉及四个主要角色:命令、具体命令、命令接收者和调用者。
以下是一个简单的命令模式的案例,假设我们要实现一个遥控器,可以控制不同家电设备(如电视、音响)的开关。
首先,定义命令接口和具体命令类:
// 命令接口
protocol Command {
func execute()
}
// 具体命令 - 开启命令
class TurnOnCommand: Command {
private var device: Device
init(device: Device) {
self.device = device
}
func execute() {
device.turnOn()
}
}
// 具体命令 - 关闭命令
class TurnOffCommand: Command {
private var device: Device
init(device: Device) {
self.device = device
}
func execute() {
device.turnOff()
}
}
然后,定义命令接收者,即家电设备:
// 命令接收者 - 家电设备
protocol Device {
func turnOn()
func turnOff()
}
class TV: Device {
func turnOn() {
print("电视已开启")
}
func turnOff() {
print("电视已关闭")
}
}
class Stereo: Device {
func turnOn() {
print("音响已开启")
}
func turnOff() {
print("音响已关闭")
}
}
最后,实现调用者,即遥控器:
// 调用者 - 遥控器
class RemoteControl {
private var onCommand: Command
private var offCommand: Command
init(onCommand: Command, offCommand: Command) {
self.onCommand = onCommand
self.offCommand = offCommand
}
func pressOnButton() {
onCommand.execute()
}
func pressOffButton() {
offCommand.execute()
}
}
现在,你可以使用命令模式创建遥控器,并将命令绑定到不同的家电设备上:
let tv = TV()
let stereo = Stereo()
let turnOnTVCommand = TurnOnCommand(device: tv)
let turnOffTVCommand = TurnOffCommand(device: tv)
let turnOnStereoCommand = TurnOnCommand(device: stereo)
let turnOffStereoCommand = TurnOffCommand(device: stereo)
let remoteControlForTV = RemoteControl(onCommand: turnOnTVCommand, offCommand: turnOffTVCommand)
let remoteControlForStereo = RemoteControl(onCommand: turnOnStereoCommand, offCommand: turnOffStereoCommand)
remoteControlForTV.pressOnButton() // 打开电视
remoteControlForTV.pressOffButton() // 关闭电视
remoteControlForStereo.pressOnButton() // 打开音响
remoteControlForStereo.pressOffButton()// 关闭音响
通过命令模式,你可以将请求的发送者(遥控器)和请求的接收者(家电设备)解耦,从而实现更加灵活和可扩展的控制系统。这种模式也允许你轻松地添加新的命令和设备类型,而不需要修改现有的代码。
网友评论