设计模式之命令模式
2018-01-30 本文已影响2527人
爱红旗渠
命令模式(Command),将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求队列或记录请求日志,以及支持可撤销的操作。
源文地址:http://ihongqiqu.com/2016/09/13/Command-Design-Pattern/
适用场景
对于大多数请求响应模式的功能,比较适合使用命令模式,命令模式对实现记录日志、撤销操作等功能比较方便。
优点
- 它能容易地设计一个命令队列;
- 在需要的情况下,可以较容易地将命令记入日志;
- 允许接受请求的一方决定是否要否决请求;
- 可以容易地实现对请求的撤销和重做;
- 由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
缺点
增加系统的复杂性,这里的复杂性应该主要指的是类的数量
UML结构图
DecoratorPattern源码
接受者,知道如何实施与执行一个与请求相关的操作。
public class Receiver {
public void action() {
System.out.println("执行操作");
}
}
命令抽象类,用来声明执行操作的接口
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void execute();
}
命令实现类,将一个抽象者对象绑定于一个动作,调用接受者响应的操作,以实现Execute
public class ConcreteCommand extends Command {
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.action();
}
}
要求命令执行这个请求
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void executeCommand() {
command.execute();
}
}
客户端调用
命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求队列或记录请求日志,以及支持可撤销的操作。
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.executeCommand();
}
}
设计模式系列:
创建型 | 结构型 | 行为型 |
---|---|---|
工厂方法 简单工厂 抽象工厂 建造者模式 单例模式 原型模式 |
组合模式 外观模式 桥接模式 代理模式 享元模式 适配器模式 装饰模式 |
策略模式 模板方法 状态模式 观察者模式 备忘录模式 迭代器模式 命令模式 职责链模式 解释器模式 访问者模式 中介者模式 |