设计模式

设计模式-命令模式

2023-10-14  本文已影响0人  Hengry

命令模式(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()// 关闭音响

通过命令模式,你可以将请求的发送者(遥控器)和请求的接收者(家电设备)解耦,从而实现更加灵活和可扩展的控制系统。这种模式也允许你轻松地添加新的命令和设备类型,而不需要修改现有的代码。

上一篇下一篇

猜你喜欢

热点阅读