命令设计模式

命令模式

命令模式定义:

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化

使用场景

1、遥控器:遥控器是一种典型的命令模式应用,遥控器中的每一个按钮都对应着一个命令对象,当用户按下按钮时,遥控器会发送相应的命令对象给电器,电器会根据命令对象来执行相应的操作。

2、厨师和服务员:在餐厅中,厨师和服务员之间的关系可以看作是一种命令模式。服务员负责接收顾客的点餐请求,将请求封装成一个命令对象,并将命令对象发送给厨师。厨师会根据命令对象来烹饪相应的菜品,完成后将菜品交给服务员。

3、智能家居:智能家居系统中,用户可以通过手机或者语音控制设备的开关、调节亮度等操作。这些操作都可以看作是命令对象,当用户发送一个命令对象时,智能家居系统会根据命令对象来控制相应的设备。

4、播放器:在音乐或者影视播放器中,用户可以通过命令对象来控制音乐或者影片的播放、暂停、快进等操作。播放器会根据命令对象来执行相应的操作。

角色定义

Receive 接收者角色

该角色就是干活的角色,命令传递到这里是应该被执行的。

Command 命令角色

需要执行的所有命令都在这里声明.

lnvoker 调用者角色

接收到命令,并执行命令。

需求背景

设计一个遥控器,用户可以通过遥控器控制电视机的开关、音量和频道。

1、定义接收者角色 Receiver,包含电视机的操作方法,如开关、音量和频道控制等。

public class TV {
    public void turnOn() {
        System.out.println("TV is on");
    }

    public void turnOff() {
        System.out.println("TV is off");
    }

    public void changeChannel(int channel) {
        System.out.println("TV channel is changed to " + channel);
    }

    public void adjustVolume(int volume) {
        System.out.println("TV volume is adjusted to " + volume);
    }
}

2、定义命令接口 Command,包含执行命令的方法 execute()。

public interface Command {
    void execute();
}

3、定义具体命令类 ConcreteCommand,实现 Command 接口,包含一个接收者对象和一个执行命令的方法 execute(),在执行命令时调用接收者对象的相应方法。

public class TurnOnCommand implements Command {
    private TV tv;

    public TurnOnCommand(TV tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.turnOn();
    }
}

public class TurnOffCommand implements Command {
    private TV tv;

    public TurnOffCommand(TV tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.turnOff();
    }
}

public class ChangeChannelCommand implements Command {
    private TV tv;
    private int channel;

    public ChangeChannelCommand(TV tv, int channel) {
        this.tv = tv;
        this.channel = channel;
    }

    @Override
    public void execute() {
        tv.changeChannel(channel);
    }
}

public class AdjustVolumeCommand implements Command {
    private TV tv;
    private int volume;

    public AdjustVolumeCommand(TV tv, int volume) {
        this.tv = tv;
        this.volume = volume;
    }

    @Override
    public void execute() {
        tv.adjustVolume(volume);
    }
}

4、定义调用者角色 Invoker,包含一个命令对象和一个执行命令的方法 executeCommand(),在执行命令时调用命令对象的 execute() 方法。

public class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void executeCommand() {
        command.execute();
    }
}

5、编写测试案例,创建一个遥控器对象和一个电视机对象,分别创建开机、关机、调节频道和音量的命令对象,并将命令对象设置到遥控器对象中,最后执行遥控器对象的执行命令方法。

public class Test {
    public static void main(String[] args) {
        TV tv = new TV();
        RemoteControl remoteControl = new RemoteControl();

        Command turnOnCommand = new TurnOnCommand(tv);
        Command turnOffCommand = new TurnOffCommand(tv);
        Command changeChannelCommand = new ChangeChannelCommand(tv, 3);
        Command adjustVolumeCommand = new AdjustVolumeCommand(tv, 50);

        remoteControl.setCommand(turnOnCommand);
        remoteControl.executeCommand();

        remoteControl.setCommand(changeChannelCommand);
        remoteControl.executeCommand();

        remoteControl.setCommand(adjustVolumeCommand);
        remoteControl.executeCommand();

        remoteControl.setCommand(turnOffCommand);
        remoteControl.executeCommand();
    }
}

6、输出结果

TV is on
TV channel is changed to 3
TV volume is adjusted to 50
TV is off

7、总结

命令模式可以将请求和处理请求的对象解耦,使得请求者和接收者之间没有直接关系,从而提高系统的灵活性和可扩展性。在本案例中,遥控器充当了调用者角色,电视机充当了接收者角色,四个具体命令类充当了命令角色,将请求和处理请求的对象解耦,使得用户可以通过遥控器来控制电视机的开关、音量和频道。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Run,boy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值