模式的定义
命令模式是一个高内聚的模式,定义如下:
Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录日志,可以提供命令的撤销和恢复功能。
模式的使用场景
只要是你认为是命令的地方,就可以采用命令模式
UML类图
角色介绍
- Receiver接收者角色
命令接收者模式,命令传递到这里执行对应的操作。
- Command命令角色
需要执行的命令都在这里声明
- Invoker调用者角色
接收到命令,并执行命令,也就是命令的发动者和调用者
命令模式封装性比较好,比较简单,项目中使用比较频繁。它把命令请求方(Invoker)和执行方(Receiver)分开,扩展性好。
模式的通用源码
通用Receiver类:
public abstract class Receiver {
public abstract void doSomething();
}
具体Receiver类:
public class ConcreteReceiver1 extends Receiver{
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("ConcreteReceiver1---doSomething");
}
}
public class ConcreteReceiver2 extends Receiver{
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("ConcreteReceiver2---doSomething");
}
}
抽象Command类:
public abstract class Command {
public abstract void execute();
}
具体Command类:
public class ConcreteCommand1 extends Command {
private Receiver receiver;
public ConcreteCommand1(Receiver receiver) {
super();
this.receiver = receiver;
}
@Override
public void execute() {
// TODO Auto-generated method stub
System.out.println("ConcreteCommand1---execute");
receiver.doSomething();
}
}
public class ConcreteCommand2 extends Command {
private Receiver receiver;
public ConcreteCommand2(Receiver receiver) {
super();
this.receiver = receiver;
}
@Override
public void execute() {
// TODO Auto-generated method stub
System.out.println("ConcreteCommand2---execute");
receiver.doSomething();
}
}
调用者Invoker类:
public class Invoker {
private Command command;
public void setCommand(Command command){
this.command = command;
}
public void action(){
this.command.execute();
}
}
场景Client类:
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Receiver receiver1 = new ConcreteReceiver1();
Command command1 = new ConcreteCommand1(receiver1);
Invoker invoker = new Invoker();
invoker.setCommand(command1);
invoker.action();
Receiver receiver2 = new ConcreteReceiver2();
Command command2 = new ConcreteCommand2(receiver2);
invoker.setCommand(command2);
invoker.action();
}
}
输出结果:
ConcreteCommand1---execute
ConcreteReceiver1---doSomething
ConcreteCommand2---execute
ConcreteReceiver2---doSomething
优点
- 类间解藕
调用者角色与接受者角色之间没有任何依赖关系,调用者实现功能时只需要调用Command抽象类的execute方法就可以,不需要知道到底是哪个接收者执行。
- 可扩展性
Command子类可以非常容易的扩展,而调用者Invoker和高层次的模块Client不产生严重的代码藕合
- 命令模式结合其他模式会更优秀
命令模式与责任链模式,实现命令族解析任务。结合模板方法模式,则可以减少Command子类的膨胀问题
缺点
命令模式的缺点就是类膨胀,如果有N多子命令,那是不是Command子类就有N多。
Android源码中的模式实现
UML类图
具体实现代码
参考资料
(1).设计模式之禅—第15章 命令模式
(2)命令模式
时间: 2024-10-06 19:48:52