学习目标:
- 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.
}
}
命令模式的优点
- 解耦:命令模式将调用操作的对象与知道如何实现该操作的对象解耦。
- 扩展性:可以很容易地添加新的命令,而无需修改现有的类。
- 日志记录:可以很容易地实现对命令执行的日志记录。
- 宏命令:可以组合多个命令为一个宏命令。
命令模式的缺点
- 可能引起更多的对象:在某些情况下,使用命令模式可能会增加系统中的对象数量,这可能会使得系统更加复杂。
通过这个例子,我们可以看到命令模式如何帮助我们构建一个灵活的系统,其中命令可以被轻松地添加、修改或撤销。