1.命令模式
在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。

命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。
命令模式包含如下角色: - Command: 抽象命令类 - ConcreteCommand: 具体命令类 - Invoker: 调用者 - Receiver: 接收者 - Client:客户类
2.实例
电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。显然,电视机遥控器就是一个典型的命令模式应用实例。

项目结构图如下:

抽象命令接口
public interface AbstractCommand {
void execute();
}
遥控器类
public class Controller {
private AbstractCommand openCommand,closeCommand,changeCommand;
public Controller(AbstractCommand openCommand,
AbstractCommand closeCommand, AbstractCommand changeCommand) {
super();
this.openCommand = openCommand;
this.closeCommand = closeCommand;
this.changeCommand = changeCommand;
}
public void open(){
this.openCommand.execute();
}
public void close(){
this.closeCommand.execute();
}
public void change(){
this.changeCommand.execute();
}
}
电视机类
public class Television {
public void open(){
System.out.println("打开电视...");
}
public void close(){
System.out.println("关闭电视...");
}
public void changeChannel(){
System.out.println("切换电视频道...");
}
}
打开电视命令类
public class TVOpenCommand implements AbstractCommand {
private Television television;
public TVOpenCommand(Television television){
this.television=television;
}
@Override
public void execute() {
this.television.open();
}
}
切换频道命令类
public class TVChangeCommand implements AbstractCommand {
private Television television;
public TVChangeCommand(Television television){
this.television=television;
}
@Override
public void execute() {
this.television.changeChannel();
}
}
关闭电视命令类
public class TVCloseCommand implements AbstractCommand {
private Television television;
public TVCloseCommand(Television television){
this.television=television;
}
@Override
public void execute() {
this.television.close();
}
}
测试类
public class TestCommandPatternDemo01 {
public static void main(String[] args) {
AbstractCommand openCommand,closeCommand,changeCommand;
Television television=new Television();
openCommand=new TVOpenCommand(television);
closeCommand=new TVCloseCommand(television);
changeCommand=new TVChangeCommand(television);
Controller controller = new Controller(openCommand,closeCommand,changeCommand);
controller.open();
controller.change();
controller.close();
}
}
运行结果:
打开电视...
切换电视频道...
关闭电视...