命令模式(Command)将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
一、命令模式
在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。需要用到命令模式,其UML图如下所示:
命令模式由以下部分组成:
命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
代码部分:
Receiver类:
class Receiver{
public void action1(){
System.out.println("开始记录");
}
public void action2(){
System.out.println("停止记录");
}
public void action3(){
System.out.println("撤销记录");
}
}
Command接口:
interface Command{
public void execute();
}
ConcreteCommand 具体命令类:
class ConcreteCommandA implements Command{
private Receiver receiver;
public ConcreteCommandA(Receiver receiver) {
this.receiver = receiver;
}
public void execute() {
receiver.action1();
}
}
class ConcreteCommandB implements Command{
private Receiver receiver;
public ConcreteCommandB(Receiver receiver) {
this.receiver = receiver;
}
public void execute() {
receiver.action2();
}
}
class ConcreteCommandC implements Command{
private Receiver receiver;
public ConcreteCommandC(Receiver receiver) {
this.receiver = receiver;
}
public void execute() {
receiver.action3();
}
}
请求类:
class Invoker{
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void action(){
command.execute();
}
}
客户端调用:
public class Test {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommandA(receiver);
Invoker invoker = new Invoker(command);
invoker.action();
command = new ConcreteCommandB(receiver);
invoker = new Invoker(command);
invoker.action();
command = new ConcreteCommandC(receiver);
invoker = new Invoker(command);
invoker.action();
command = new ConcreteCommandA(receiver);
invoker = new Invoker(command);
invoker.action();
}
}
运行结果(代码亲测,可以通过):
代码地址:Command
二、模式总结
命令模式的特点:
解除了请求者与实现者之间的耦合,降低了系统的耦合度。
对请求排队或记录请求日志,支持撤销操作。
可以容易地设计一个组合命令。
新命令可以容易地加入到系统中
命令模式的适用场景:
当需要对行为进行“记录、撤销/重做”等处理时。
系统需要将请求者和接收者解耦,使得调用者和接收者不直接交互。
系统需要在不同时间指定请求、请求排队和执行请求。
系统需要将一组操作组合在一起,即支持宏命令。
欢迎大家评论留言,点击查看更多设计模式。