命令模式

命令模式

所有电器命令的接口
interface Command{
    //执行动作
    public void execute();
    //撤销命令
    public void undo();
}
具体电器类
class LightReceiver{
    public void on(){
        System.out.println("电灯开了");
    }
    public void off(){
        System.out.println("电灯关闭了");
    }
}
class TvReceiver{
    public void on(){
        System.out.println("电视机开了");
    }
    public void off(){
        System.out.println("电视机关了");
    }
}
电器命令实现类

电灯的开和关命令

class LightOnCommand implements Command{
    private LightReceiver lightReceiver;

    public LightOnCommand(LightReceiver lightReceiver) {
        this.lightReceiver = lightReceiver;
    }

    @Override
    public void execute() {
        lightReceiver.on();
    }

    @Override
    public void undo() {
        lightReceiver.off();
    }
}
class LightOffCommand implements Command{
    private LightReceiver lightReceiver;

    public LightOffCommand(LightReceiver lightReceiver) {
        this.lightReceiver = lightReceiver;
    }

    @Override
    public void execute() {
        lightReceiver.off();
    }

    @Override
    public void undo() {
        lightReceiver.on();
    }
}

电视的开和关命令

class OnTVCommand implements Command{
    private TvReceiver tvReceiver;

    public OnTVCommand(TvReceiver tvReceiver) {
        this.tvReceiver = tvReceiver;
    }

    @Override
    public void execute() {
        tvReceiver.on();
    }

    @Override
    public void undo() {
        tvReceiver.off();
    }
}
class OffTVCommand implements Command{
    private TvReceiver tvReceiver;

    public OffTVCommand(TvReceiver tvReceiver) {
        this.tvReceiver = tvReceiver;
    }

    @Override
    public void execute() {
        tvReceiver.off();
    }

    @Override
    public void undo() {
        tvReceiver.on();
    }
}

什么都不做的空命令

class NoCommand implements Command{
    @Override
    public void execute() {

    }

    @Override
    public void undo() {

    }
}
遥控器
class RemoteCommand{
    Command[] onCommands;
    Command[] offCommands;

    //撤销的命令
    Command undoCommand;

    public RemoteCommand(){
        onCommands = new Command[5];
        offCommands = new Command[5];
        for (int i = 0; i <5 ; i++) {
            onCommands[i] = new NoCommand();
            offCommands[i] = new NoCommand();
        }
    }

    //给按钮设置功能
    public void setCommand(int no,Command oncommand,Command offcommand){
        onCommands[no] = oncommand;
        offCommands[no] = offcommand;
    }
    //执行按下的开的按钮
    public void onButtonWasPushed(int no){
        onCommands[no].execute();
        //记录操作
        undoCommand = onCommands[no];
    }
    //执行按下的关的按钮
    public void offButtonWasPushed(int no){
        offCommands[no].execute();
        //记录操作
        undoCommand = offCommands[no];
    }
    //按下撤销按钮
    public void undoButtonWasPushed(){
        undoCommand.undo();
    }
}
测试类
public class CommandTest {
    public static void main(String[] args) {
        LightReceiver lightReceiver = new LightReceiver();
        LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
        LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);

        TvReceiver tvReceiver = new TvReceiver();
        OnTVCommand onTVCommand = new OnTVCommand(tvReceiver);
        OffTVCommand offTVCommand = new OffTVCommand(tvReceiver);

        RemoteCommand remoteCommand = new RemoteCommand();

        remoteCommand.setCommand(0,lightOnCommand,lightOffCommand);
        remoteCommand.setCommand(1,onTVCommand,offTVCommand);

        remoteCommand.onButtonWasPushed(0);
        remoteCommand.undoButtonWasPushed();
        remoteCommand.offButtonWasPushed(0);
        remoteCommand.undoButtonWasPushed();

        remoteCommand.onButtonWasPushed(1);
        remoteCommand.undoButtonWasPushed();
        remoteCommand.offButtonWasPushed(1);
        remoteCommand.undoButtonWasPushed();
    }
}

这种设计遵守了开闭原则,添加一个具体电器,不需要对遥控器进行修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值