定义:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令,对请 求排队或者记录请求日志,可以提供命令的撤销和恢复功能
优点:1.调用者角色与接收者角色之间没有任何依赖关系,松耦合。
2.Command可像其他的对象一样被操纵和扩展,可以增加和修改。可以装配成组合命令
3从而客户端发出的请求可以在被处理之前都存放在Invoker类的容器中,可以在这个类中对请求排序,筛选,类似于aop
缺点:1.使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用
使用场景:1.在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理
2.队列
引申:1.命令模式结合其他模式会更优秀:命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少 Command子类的膨胀问题。
类图:
Receiver 要执行的方法
代码
Receiver类
1. class Receiver{ 2. void auxiliary() { 3. System.out.println("滚去辅助"); 4. } 5. void fightWild() { 6. System.out.println("滚去打野"); 7. } 8. void hangUp() { 9. System.out.println("滚去挂机"); 10. } 11. }
Command (固定写法)
1. public interface Command { 2. /** 3. * @MethodName execute 4. * @Descrition 命令执行。命令执行之前和之后可做自己想要的操作 5. * @Param [] 6. * @return void 7. */ 8. void execute(); 9. }
ConcreteCommand(固定写法 实现接口 去调用接受者的方法)
1. public class ConcreteCommandA implements Command{ 2. 3. private Receiver receiver;//持有行为执行者的引用 4. 5. public ConcreteCommandA(Receiver receiver) { 6. this.receiver = receiver; 7. } 8. 9. @Override 10. public void execute() { 11. receiver.auxiliary(); 12. } 13. }
1. public class ConcreteCommandB implements Command{ 2. 3. private Receiver receiver;//持有行为执行者的引用 4. 5. public ConcreteCommandB(Receiver receiver) { 6. this.receiver = receiver; 7. } 8. 9. @Override 10. public void execute() { 11. receiver.fightWild(); 12. } 13. }
Invoker(个人理解如同队列 将Command临时放入放入)
1. public class Invoker { 2. private Command command;//持有命令类的引用 3. 4. public Invoker(Command command) { 5. this.command = command; 6. } 7. 8. //get set方法 9. 10. /** 11. * @MethodName toMakeIt 12. * @Descrition 执行请求 13. * @Param [] 14. * @return void 15. */ 16. public void toMakeIt(){ 17. command.execute(); 18. } 19. }
调用
1. public class Client { 2. public static void main(String[] args) { 3. //生成队列 4. Invoker invoker = new Invoker(); 5. Command commandA = new ConcreteCommandA(new Receiver()) 6. invoker.setCommand(commandA); 7. invoker.toMakeIt(); 8. Command commandB = new ConcreteCommandA(new Receiver()) 9. invoker.setCommand(commandB ); 10. invoker.toMakeIt(); 11. 12. } 13. }