命令模式定义
将一个请求封装成一个对象,从而让你使用不同的请求吧客户端参数化,对请求排队或记录请求日志,可以提供命令的撤销和恢复功能。
命令模式角色
(1)Receive接受者角色
该角色,就是具体执行的角色,命令传达到这就应该被执行。
(2)Command命令模式
用于所有命令声明
(3)Invoker调用角色
收到命令,并执行命令。命令模式
public abstract class Receiver {
/**
* 接受者处理的业务
*/
public abstract void doSomething();
}
public class ConcreteReceiver extends Receiver{
/**
* 接受者处理的业务
*/
@Override
public void doSomething() {
}
}
public abstract class Command {
/**
* 每个命令执行命令的方法
*/
public abstract void execute();
}
public class ConcreteCommand extends Command {
/**
* 具体执行的receiver
*/
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
/**
* 实现命令
*/
@Override
public void execute() {
this.receiver.doSomething();
}
}
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void action(){
this.command.execute();
}
}
public class Client {
public static void main(String[] args) {
/**
* 调用者
*/
Invoker invoker = new Invoker();
/**
* 接受者
*/
Receiver receiver = new ConcreteReceiver();
/**
* 定义发送给接受者的命令
*/
Command command = new ConcreteCommand(receiver);
/**
* 命令交给调用者执行
*/
invoker.setCommand(command);
invoker.action();
}
}
命令模式优点
(1)解耦
调用者与接收者之间没有依赖关系,调用者实现功能时只需要调用Command执行。
(2)与其他模式结合使用
结合责任链实现命令族解析,结合模板减少Command子类膨胀。命令模式缺点
Commang子类会膨胀
使用场景
只要认为是命令的地方就可以采用命令模式
学习内容与收获:
(1)和导师沟通,咨询有这周遇到的问题。wiki:沟通总结
(2)总结参加导师组会中自己也存在的问题
(3)设计模式——命令模式:wiki:命令模式