Command: 命令模式

doge

命令模式是一种行为型设计模式,它将请求封装成一个对象echo "<br>",从而允许我们使用不同的请求、队列或者日志来参数化其他对象。命令模式支持撤销操作。

在命令模式中,有以下几个角色:

  • 命令 (Command):定义命令接口,并包含一个执行该命令的方法。
  • 具体命令 (Concrete Command):实现命令接口,具体执行某个操作。echo "<br>"
  • 调用者 (Invoker):包含一个命令对象,并在某个时间点调用该命令对象的方法。
  • 接收者 (Receiver):包含执行命令所需的代码。

echo "<br>"
doge

适用场景

  • 系统需要将请求者和接收者解耦,使得命令发送者不需要知道接收者的实现细节。
  • 系统需要支持命令的撤销和恢复操作。echo "<br>"
  • 系统需要将一组操作组合在一起,形成宏命令。

echo "<br>"

优点
  • 降低系统 耦合度,使得发送者和接收者完全解耦。
  • 容易添加新的命令或者删除旧的命令。
  • 支持命令的撤销和恢复操作。echo "<br>"
  • 支持宏命令。

echo "<br>"

缺点
  • 可能导致系统中命令的数量剧增。
  • 可能引入额外的接口和类。

doge

代码实现

PHP
// 命令接口
interface Command {
    public function execute();
}

// 开机命令
class PowerOnCommand implements Command {
    private $receiver;

    public function __construct(TV $receiver) {
        $this->receiver = $receiver;
    }

    public function execute() {
        $this->receiver->powerOn();
    }
}

// 关机命令
class PowerOffCommand implements Command {
    private $receiver;

    public function __construct(TV $receiver) {
        $this->receiver = $receiver;
    }

    public function execute() {
        $this->receiver->powerOff();
    }
}

// 声音调高命令
class VolumeUpCommand implements Command {
    private $receiver;

    public function __construct(TV $receiver) {
        $this->receiver = $receiver;
    }

    public function execute() {
        $this->receiver->volumeUp();
    }
}

// 声音调低命令
class VolumeDownCommand implements Command {
    private $receiver;

    public function __construct(TV $receiver) {
        $this->receiver = $receiver;
    }

    public function execute() {
        $this->receiver->volumeDown();
    }
}

// 电视类,接收者
class TV {
    public function powerOn() {
        echo "电视机开机\n";
    }

    public function powerOff() {
        echo "电视机关机\n";
    }

    public function volumeUp() {
        echo "电视机音量调高\n";
    }

    public function volumeDown() {
        echo "电视机音量调低\n";
    }
}

// 遥控器类,调用者
class RemoteControl {
    private $onCommand;
    private $offCommand;
    private $volumeUpCommand;
    private $volumeDownCommand;

    public function __construct(Command $onCommand, Command $offCommand, Command $volumeUpCommand, Command $volumeDownCommand) {
        $this->onCommand = $onCommand;
        $this->offCommand = $offCommand;
        $this->volumeUpCommand = $volumeUpCommand;
        $this->volumeDownCommand = $volumeDownCommand;
    }

    public function powerOn() {
        $this->onCommand->execute();
    }

    public function powerOff() {
        $this->offCommand->execute();
    }

    public function volumeUp() {
        $this->volumeUpCommand->execute();
    }

    public function volumeDown() {
        $this->volumeDownCommand->execute();
    }
}

// 客户端
// 创建电视机对象
$tv = new TV();

// 创建命令对象
$powerOnCommand = new PowerOnCommand($tv);
$powerOffCommand = new PowerOffCommand($tv);
$volumeUpCommand = new VolumeUpCommand($tv);
$volumeDownCommand = new VolumeDownCommand($tv);

// 创建遥控器对象
$remoteControl = new RemoteControl($powerOnCommand, $powerOffCommand, $volumeUpCommand, $volumeDownCommand);

// 执行命令操作
$remoteControl->powerOn(); // 电视机开机
$remoteControl->volumeUp(); // 电视机音量调高
$remoteControl->volumeDown(); // 电视机音量调低
$remoteControl->powerOff(); // 电视机关机
Go
// 命令接口
type Command interface {
    Execute()
}

// 开机命令
type PowerOnCommand struct {
    receiver *TV
}

func (c *PowerOnCommand) Execute() {
    c.receiver.PowerOn()
}

// 关机命令
type PowerOffCommand struct {
    receiver *TV
}

func (c *PowerOffCommand) Execute() {
    c.receiver.PowerOff()
}

// 声音调高命令
type VolumeUpCommand struct {
    receiver *TV
}

func (c *VolumeUpCommand) Execute() {
    c.receiver.VolumeUp()
}

// 声音调低命令
type VolumeDownCommand struct {
    receiver *TV
}

func (c *VolumeDownCommand) Execute() {
    c.receiver.VolumeDown()
}

// 电视类,接收者
type TV struct {
}

func (t *TV) PowerOn() {
    fmt.Println("电视机开机")
}

func (t *TV) PowerOff() {
    fmt.Println("电视机关机")
}

func (t *TV) VolumeUp() {
    fmt.Println("电视机音量调高")
}

func (t *TV) VolumeDown() {
    fmt.Println("电视机音量调低")
}

// 遥控器类,调用者
type RemoteControl struct {
    onCommand         Command
    offCommand        Command
    volumeUpCommand   Command
    volumeDownCommand Command
}

func NewRemoteControl(onCommand, offCommand, volumeUpCommand, volumeDownCommand Command) *RemoteControl {
    return &RemoteControl{
        onCommand:         onCommand,
        offCommand:        offCommand,
        volumeUpCommand:   volumeUpCommand,
        volumeDownCommand: volumeDownCommand,
    }
}

func (r *RemoteControl) PowerOn() {
    r.onCommand.Execute()
}

func (r *RemoteControl) PowerOff() {
    r.offCommand.Execute()
}

func (r *RemoteControl) VolumeUp() {
    r.volumeUpCommand.Execute()
}

func (r *RemoteControl) VolumeDown() {
    r.volumeDownCommand.Execute()
}

// 客户端
// 创建电视机对象
tv := &TV{}

// 创建命令对象
powerOnCommand := &PowerOnCommand{receiver: tv}
powerOffCommand := &PowerOffCommand{receiver: tv}
volumeUpCommand := &VolumeUpCommand{receiver: tv}
volumeDownCommand := &VolumeDownCommand{receiver: tv}

// 创建遥控器对象
remoteControl := NewRemoteControl(powerOnCommand, powerOffCommand, volumeUpCommand, volumeDownCommand)

// 执行命令操作
remoteControl.PowerOn()      // 电视机开机
remoteControl.VolumeUp()     // 电视机音量调高
remoteControl.VolumeDown()   // 电视机音量调低
remoteControl.PowerOff()     // 电视机关机

doge

Java
// 命令接口
interface Command {
    void execute();
}

// 开机命令
class PowerOnCommand implements Command {
    private TV receiver;

    public PowerOnCommand(TV receiver) {
        this.receiver = receiver;
    }

    public void execute() {
        receiver.powerOn();
    }
}

// 关机命令
class PowerOffCommand implements Command {
    private TV receiver;

    public PowerOffCommand(TV receiver) {
        this.receiver = receiver;
    }

    public void execute() {
        receiver.powerOff();
    }
}

// 声音调高命令
class VolumeUpCommand implements Command {
    private TV receiver;

    public VolumeUpCommand(TV receiver) {
        this.receiver = receiver;
    }

    public void execute() {
        receiver.volumeUp();
    }
}

// 声音调低命令
class VolumeDownCommand implements Command {
    private TV receiver;

    public VolumeDownCommand(TV receiver) {
        this.receiver = receiver;
    }

    public void execute() {
        receiver.volumeDown();
    }
}

// 电视类,接收者
class TV {
    public void powerOn() {
        System.out.println("电视机开机");
    }

    public void powerOff() {
        System.out.println("电视机关机");
    }

    public void volumeUp() {
        System.out.println("电视机音量调高");
    }

    public void volumeDown() {
        System.out.println("电视机音量调低");
    }
}

// 遥控器类,调用者
class RemoteControl {
    private Command onCommand;
    private Command offCommand;
    private Command volumeUpCommand;
    private Command volumeDownCommand;

    public RemoteControl(Command onCommand, Command offCommand, Command volumeUpCommand, Command volumeDownCommand) {
        this.onCommand = onCommand;
        this.offCommand = offCommand;
        this.volumeUpCommand = volumeUpCommand;
        this.volumeDownCommand = volumeDownCommand;
    }

    public void powerOn() {
        onCommand.execute();
    }

    public void powerOff() {
        offCommand.execute();
    }

    public void volumeUp() {
        volumeUpCommand.execute();
    }

    public void volumeDown() {
        volumeDownCommand.execute();
    }
}

// 客户端
// 创建电视机对象
TV tv = new TV();

// 创建命令对象
Command powerOnCommand = new PowerOnCommand(tv);
Command powerOffCommand = new PowerOffCommand(tv);
Command volumeUpCommand = new VolumeUpCommand(tv);
Command volumeDownCommand = new VolumeDownCommand(tv);

// 创建遥控器对象
RemoteControl remoteControl = new RemoteControl(powerOnCommand, powerOffCommand, volumeUpCommand, volumeDownCommand);

// 执行命令操作
remoteControl.powerOn();      // 电视机开机
remoteControl.volumeUp();     // 电视机音量调高
remoteControl.volumeDown();   // 电视机音量调低
remoteControl.powerOff();     // 电视机关机

![在这里插入图片描述](https://img-blog.csdnimg.cn/cc6b09b121e3444babe87bbbbcacaa42.png
doge
精读《设计模式 - Command 命令模式》

doge

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Slowlyo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值