23种设计模式总览
创建型模式
结构型模式
- 外观模式(Facade)
- 适配器模式(Adapter)
- 代理模式(Proxy)
- 组合模式(Composite)
- 享元模式(Flyweight)
- 装饰模式(Decorator)
- 桥接模式(Bridge)
行为型模式
- 中介者模式(Mediator)
- 观察者模式(Observer)
- 命令模式(Command)
- 迭代器模式(Iterator)
- 模板方法模式(Template Method)
- 策略模式(Strategy)
- 状态模式(State)
- 备忘录模式(Memento)
- 解释器模式(Interpreter)
- 职责链模式(Chain of Responsibility)
- 访问者模式(Visitor)
定义
将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求队列或者记录请求日志,以及支持可撤销的操作。
优缺点
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
缺点: 使用命令模式可能会导致某些系统有过多的具体命令类。
使用场景
- 需要对行为进行记录,撤销,重做,事务处理时。
- 需要抽象出待执行的动作,然后以参数的形式提供出来。
UML
- Receiver : 命令接收者,负责具体执行一个请求。在接收者中封装的具体操作逻辑的方法叫行动方法。
- Command:命令角色,定义具体命令类的接口。
- ConcreteCommand : 具体的命令角色。,实现了Command接口,execute()方法中调用接收者Receiver的相关方法,弱化了命令接收者和具体行为之间的耦合。
- Invoker:请求者角色,调用命令对象执行具体的请求。
具体实现:
接收者,执行具体命令
public class Receiver {
public void action(){
System.out.println("具体执行");
}
}
抽象的命令
public interface Command {
void execute();
}
具体的命令
public class ConcreteCommand implements Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action();
}
}
发起请求者
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void action(){
command.execute();
}
}
客户端调用
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.action();
}
}
输出
具体执行
总结
命令模式本质就是将命令进行封装,将命令的发起者和真正的执行者隔离,降低耦合度。
命令请求者只需要发起请求,命令的具体执行时什么用,由谁执行都不需要知道。