版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Pro_Vinny/article/details/81713635
命令模式,将行为实现抽象成对象,并使其与请求者解耦,并能对行为进行纪录、撤销、事务等操作。
一、关键点
1)我们先看下这个模式的关键点:
行为与请求解耦:将一组行为抽象成对象,使之与请求者解耦开来,区别与之前请求者与行为的直接耦合,从而给控制的灵活变化带来了机会,并更容易对模块进行拓展;
灵活控制:支持对命令对象的排队、取消、修改、事务等功能,整个执行过程变得更加灵活。
2)我们再来看下它的类图关系:
Client:客户端角色。
Invoker:请求着角色。
Command:命令的抽象接口。
ConcreteCommand:具体的命令实现对象。
Receiver:接受者角色,其实就是具体实施业务的角色。
二、实现
2.1 执行者Receiver
public class Receiver {
public void handle() {
/** do something */
}
}
2.2 抽象命令接口Command
public interface Command {
void execute();
}
2.3 具体命令对象 ConcreteCommand
public class ConcreteCommand implements Command {
private Receiver mReceiver;
public ConcreteCommand(Receiver receiver){
this.mReceiver = receiver;
}
@Override
public void execute() {
mReceiver.handle();
}
}
2.4 请求者色Invoker
public class Invoker {
private Command mCommand;
public Invoker(Command command) {
mCommand = command;
}
public void execute() {
mCommand.execute();
}
}
2.5 客户端Client
public class Client {
public static void main(String[] args) {
Invoker invoker = new Invoker(new ConcreteCommand(new Receiver()));
invoker.execute();
}
}
三、小结
3.1 解耦。这个模式的最大特点就是命令的请求与执行进行了解耦,增加了两者各自变化的可能性;
3.2 灵活。由于上述的解耦,让命令的执行变得更灵活,也丰富了功能,如记录、撤销、事务等;
3.2 开闭原则。在实际使用的过程就会发现,当执行更多命令时,能在基本不改变原来的功能上进行灵活的拓展,可维护性更高。