通俗易懂的Java设计模式之 --命令模式

Java中的命令模式(Command Pattern)是一种行为型设计模式,它允许将请求或操作封装为一个对象,以便于对请求的操作进行参数化和异步处理。

命令模式中包含三个核心角色:命令接口(Command)、命令实现类(ConcreteCommand)和命令执行者(Receiver)。命令接口定义了一个命令对象应该具有的操作,命令实现类则负责实现具体的命令逻辑,命令执行者则负责执行命令。

下面是一个简单的例子,假设有一个电视机(TV)类,它有打开电视、关闭电视、调整音量等多个操作。现在我们需要将这些操作封装为命令对象,并支持撤销操作。

首先定义一个命令接口:

public interface Command {
    void execute();//执行操作
    void undo();//撤销操作
}

然后实现具体的命令实现类:

//开电视命令
public class TurnOnCommand implements Command {
    private final TV tv;

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

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

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

//关电视命令
public class TurnOffCommand implements Command {
    private final TV tv;

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

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

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

//音量增加命令
public class VolumeUpCommand implements Command {
    private final TV tv;

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

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

    @Override
    public void undo() {
        tv.volumeDown();
    }
}

//音量减小命令
public class VolumeDownCommand implements Command {
    private final TV tv;

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

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

    @Override
    public void undo() {
        tv.volumeUp();
    }
}

最后定义一个命令执行者:

public class TV {
    private int volume;

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

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

    public void volumeUp() {
        volume++;
        System.out.println("Volume up: " + volume);
    }

    public void volumeDown() {
        volume--;
        System.out.println("Volume down: " + volume);
    }
}

现在,我们可以使用命令模式来调用电视机的操作:

TV tv = new TV();
Command turnOnCommand = new TurnOnCommand(tv);
Command turnOffCommand = new TurnOffCommand(tv);
Command volumeUpCommand = new VolumeUpCommand(tv);
Command volumeDownCommand = new VolumeDownCommand(tv);

turnOnCommand.execute();        // Output: TV turned on
volumeUpCommand.execute();      // Output: Volume up: 1
volumeUpCommand.execute();      // Output: Volume up: 2
volumeDownCommand.execute();    // Output: Volume down: 1

现在,我们可以将这些命令对象存储到一个列表中,以便于执行和撤销操作:

List<Command> commands = new ArrayList<>();
commands.add(turnOnCommand);
commands.add(volumeUpCommand);
commands.add(volumeUpCommand);
commands.add(volumeDownCommand);
commands.add(turnOffCommand);

// 执行所有命令
for (Command command : commands) {
    command.execute();
}

// 撤销最后一个命令
commands.get(commands.size() - 1).undo();

输出结果如下:

TV turned on
Volume up: 1
Volume up: 2
Volume down: 1
TV turned off
TV turned on

在这个例子中,我们通过命令模式将电视机的操作封装为一个命令对象,并将命令对象存储到列表中,以便于执行和撤销操作。通过这种方式,我们可以将操作的执行时间和执行方式解耦出来,并支持撤销操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值