# 七大软件规划准则
# 规划形式-工厂形式
# 规划形式-单例形式
# 规划形式-原型形式
# 规划形式-策略形式
# 规划形式-责任链形式
# 规划形式-制作者形式
# 规划形式-深度分析代理形式
# 规划形式-门面形式
# 规划形式-装修器形式
# 规划形式-享元形式
# 规划形式-组合形式
# 规划形式-适配器形式
# 规划形式-桥接形式
# 规划形式-派遣形式
# 规划形式-模板办法形式
# 规划形式-迭代器形式
将一个恳求封装为一个目标,从而使你可用不同的恳求对客户进行参数化,对恳求排队或记载恳求日志,以及支撑可撤销的操作
指令形式( Command Pattern) 是对指令的封装,每一个指令都是一个操作:恳求的一方
宣布恳求要求履行一个操作;接纳的一方收到恳求,并履行操作。指令形式解耦了恳求方和接
收方,恳求方只需恳求履行指令,不用关心指令是怎样被接纳,怎样被操作以及是否被履行⋯等。
指令形式属于行为型形式。
指令形式的使用层场景
当系统的某项操作具有指令语义时,且指令完成不稳定(改变),那么能够经过指令形式解 耦恳求与完成,使用笼统指令接口使恳求方代码架构稳定,封装接纳方详细指令完成细节。接 收方与笼统指令接口出现弱耦合(内部办法无需共同),具有杰出的扩展性。指令形式适用于 以下使用场景:
- 现实语义中具有 “指令”的操作(如指令菜单,shell 指令⋯);
- 恳求调用者和恳求的接纳者需求解耦,使得调用者和接纳者不直接交互;
- 需求笼统出等待履行的行为,比方撤销(Undo)操作和恢复(Redo)等操作;
- 需求支撑指令宏(即指令组合操作)。
指令形式的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();
}
}
从上面的类图中就能够发现Invoker
和Receiver
是没有耦合的,Invoker
经过Command
和Receiver
建立联系的,这里 Invoker
就相当于咱们平时写事务中的一个事务逻辑的完成,你能够了解成是一个 service
,而 Receiver
相当于这个事务中的详细某个功用的完成,假如此时事务的需求需求变动,此时咱们只需求更改Command
中Receiver
的使用或者为了契合开闭准则咱们完全能够从头创建一个Command
,对应者新的Receiver
即可,这样对该关于咱们整体的事务逻辑是没有改动的。
一起也能够结合装修器形式,在原有的功用基础上添加一些其他的功用比方日志的收集等等,假如指令不是一个单独的指令而是一个指令的集合 Command
会对应着多个指令,一起 Receiver
也对应这多个办法,假如能对 Receiver
进行笼统,这不就演变成了桥接形式,变成了command和Receiver两个改变的维度,这样扩展性更好
指令形式优缺陷
优点:
- 经过引进中间件(笼统接口),解耦了指令恳求与完成;
- 扩展性杰出,能够很容易地添加新指令;
- 支撑组合指令,支撑指令队列;
- 能够在现有指令的基础上,添加额定功用(比方日志记载…,结合装修器形式更酸爽)。
缺陷:
- 详细指令类或许过多;
- 指令形式的成果其实就是接纳方的履行成果,可是为了以指令的形式进行架构,解耦恳求与完成,引进了额定类型结构(引进了恳求方与笼统指令接口),添加了了解上的困难(不过这 也是规划形式带来的一个通病,笼统必然会引进额定类型;笼统肯定比严密难了解)。