美文网首页设计模式
设计模式-命令模式

设计模式-命令模式

作者: Hengry | 来源:发表于2023-10-14 18:06 被阅读0次

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

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

    相关文章

      网友评论

        本文标题:设计模式-命令模式

        本文链接:https://www.haomeiwen.com/subject/vaxabdtx.html