Command模式举个例子——更容易理解

学习目标:

  • Command模式举个例子——更容易理解

学习内容:

模式介绍

命令模式(Command Pattern)是一种行为型设计模式,它将一个请求封装为一个对象,从而允许用户使用不同的请求、队列或日志请求来参数化其他对象。命令模式也支持可撤销的操作。它通常用于解耦执行操作的对象与知道如何实现该操作的对象。

详细例子:简单的遥控器

假设我们有一个简单的遥控器,可以控制电视的开关和音量调节。

1. 定义命令接口

首先,我们定义一个命令接口Command,它包含一个执行操作的方法execute。

public interface Command {
    void execute();
}

2. 实现具体命令

然后,我们为电视的开关和音量调节创建具体的命令实现。

public class PowerOnCommand implements Command {
    private final TV tv;

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

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

public class VolumeUpCommand implements Command {
    private final TV tv;

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

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

public class VolumeDownCommand implements Command {
    private final TV tv;

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

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

3. 定义接收者

接收者(TV类)负责执行实际的操作。

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

    public void volumeUp() {
        System.out.println("Volume is up.");
    }

    public void volumeDown() {
        System.out.println("Volume is down.");
    }
}

4. 定义请求者

请求者(RemoteControl类)负责发送命令。

public class RemoteControl {
    private Command command;

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

    public void pressButton() {
        if (command != null) {
            command.execute();
        }
    }
}

5. 使用命令模式

现在,我们可以创建遥控器对象,设置命令,然后按下按钮来执行操作。

public class Client {
    public static void main(String[] args) {
        TV tv = new TV();
        Command powerOn = new PowerOnCommand(tv);
        Command volumeUp = new VolumeUpCommand(tv);
        Command volumeDown = new VolumeDownCommand(tv);

        RemoteControl remote = new RemoteControl();
        remote.setCommand(powerOn);
        remote.pressButton(); // 输出: TV is powered on.

        remote.setCommand(volumeUp);
        remote.pressButton(); // 输出: Volume is up.

        remote.setCommand(volumeDown);
        remote.pressButton(); // 输出: Volume is down.
    }
}

命令模式的优点

  • 解耦:命令模式将调用操作的对象与知道如何实现该操作的对象解耦。
  • 扩展性:可以很容易地添加新的命令,而无需修改现有的类。
  • 日志记录:可以很容易地实现对命令执行的日志记录。
  • 宏命令:可以组合多个命令为一个宏命令。

命令模式的缺点

  • 可能引起更多的对象:在某些情况下,使用命令模式可能会增加系统中的对象数量,这可能会使得系统更加复杂。

通过这个例子,我们可以看到命令模式如何帮助我们构建一个灵活的系统,其中命令可以被轻松地添加、修改或撤销。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

java 猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值