# 七大软件规划准则
# 规划形式-工厂形式
# 规划形式-单例形式
# 规划形式-原型形式
# 规划形式-策略形式
# 规划形式-责任链形式
# 规划形式-制作者形式
# 规划形式-深度分析代理形式
# 规划形式-门面形式
# 规划形式-装修器形式
# 规划形式-享元形式
# 规划形式-组合形式
# 规划形式-适配器形式
# 规划形式-桥接形式
# 规划形式-派遣形式
# 规划形式-模板办法形式
# 规划形式-迭代器形式

将一个恳求封装为一个目标,从而使你可用不同的恳求对客户进行参数化,对恳求排队或记载恳求日志,以及支撑可撤销的操作

指令形式( Command Pattern) 是对指令的封装,每一个指令都是一个操作:恳求的一方 宣布恳求要求履行一个操作;接纳的一方收到恳求,并履行操作。指令形式解耦了恳求方和接 收方,恳求方只需恳求履行指令,不用关心指令是怎样被接纳,怎样被操作以及是否被履行⋯等。
指令形式属于行为型形式。

指令形式的使用层场景

当系统的某项操作具有指令语义时,且指令完成不稳定(改变),那么能够经过指令形式解 耦恳求与完成,使用笼统指令接口使恳求方代码架构稳定,封装接纳方详细指令完成细节。接 收方与笼统指令接口出现弱耦合(内部办法无需共同),具有杰出的扩展性。指令形式适用于 以下使用场景:

  1. 现实语义中具有 “指令”的操作(如指令菜单,shell 指令⋯);
  2. 恳求调用者和恳求的接纳者需求解耦,使得调用者和接纳者不直接交互;
  3. 需求笼统出等待履行的行为,比方撤销(Undo)操作和恢复(Redo)等操作;
  4. 需求支撑指令宏(即指令组合操作)。

指令形式的UML类图

设计模式-命令模式

public interface ICommand {
    void execute();
}
public class ConcreteCommand implements ICommand{
    private final Receiver receiver;
    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }
    @Override
    public void execute() {
        receiver.action();
    }
}
public class Receiver {
    public void action(){
        System.out.println("接纳方接纳到指令并履行");
    }
}
public class Invoker {
    private final ICommand command;
    public Invoker(ICommand command) {
        this.command = command;
    }
    public void action(){
        command.execute();
    }
}
public class Test {
    public static void main(String[] args) {
        ConcreteCommand concreteCommand = new ConcreteCommand(new Receiver());
        Invoker invoker = new Invoker(concreteCommand);
        invoker.action();
    }
}

从上面的类图中就能够发现InvokerReceiver是没有耦合的,Invoker经过CommandReceiver建立联系的,这里 Invoker就相当于咱们平时写事务中的一个事务逻辑的完成,你能够了解成是一个 service,而 Receiver相当于这个事务中的详细某个功用的完成,假如此时事务的需求需求变动,此时咱们只需求更改CommandReceiver的使用或者为了契合开闭准则咱们完全能够从头创建一个Command,对应者新的Receiver即可,这样对该关于咱们整体的事务逻辑是没有改动的。

一起也能够结合装修器形式,在原有的功用基础上添加一些其他的功用比方日志的收集等等,假如指令不是一个单独的指令而是一个指令的集合 Command会对应着多个指令,一起 Receiver也对应这多个办法,假如能对 Receiver进行笼统,这不就演变成了桥接形式,变成了command和Receiver两个改变的维度,这样扩展性更好

指令形式优缺陷

优点:

  1. 经过引进中间件(笼统接口),解耦了指令恳求与完成;
  2. 扩展性杰出,能够很容易地添加新指令;
  3. 支撑组合指令,支撑指令队列;
  4. 能够在现有指令的基础上,添加额定功用(比方日志记载…,结合装修器形式更酸爽)。

缺陷:

  1. 详细指令类或许过多;
  2. 指令形式的成果其实就是接纳方的履行成果,可是为了以指令的形式进行架构,解耦恳求与完成,引进了额定类型结构(引进了恳求方与笼统指令接口),添加了了解上的困难(不过这 也是规划形式带来的一个通病,笼统必然会引进额定类型;笼统肯定比严密难了解)。