命令模式 
定义 
Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations. 
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
 
命令模式的示意图 
代码实现 
接收者 
客户最终调用的角色
 
抽象接收者 
 
1 2 3 4 5 6 7 8 9 package  org.example.command;public  abstract  class  Receiver   {         public  abstract  void  receive ()  ; } 
 
具体接收者 
 
1 2 3 4 5 6 7 8 9 10 11 package  org.example.command;public  class  ConcreteRecevier1  extends  Receiver   {    @Override      public  void  receive ()   {         System.out.println("需要执行的命令需求" );     } } 
 
命令 
调用接收者
 
抽象命令 
 
1 2 3 4 5 6 7 8 package  org.example.command;public  abstract  class  Command   {         public  abstract  void  execute ()  ; } 
 
具体命令 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package  org.example.command;public  class  ConcreteCommand1  extends  Command   {    private  Receiver receiver ;          public  ConcreteCommand1 (Receiver receiver)  {         this .receiver = receiver ;     }          @Override      public  void  execute ()   {         this .receiver.receive();     } } 
 
调用者 
调用命令
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package  org.example.command;public  class  Invoker   {    private  Command command ;          public  void  setCommand (Command command)  {         this .command = command ;     }          public  void  action ()  {         this .command.execute();     } } 
 
场景实现 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public  class  App   {         public  static  void  main (String[] args)   {                  Receiver receiver = new  ConcreteRecevier1();                  Command command = new  ConcreteCommand1(receiver);                  Invoker invoker = new  Invoker();                  invoker.setCommand(command);                  invoker.action();     } } 
 
应用场景 
在gui开发中可以采用命令模式。一个按钮点击就是一个命令。 
模拟dos和shell命令也可以采用命令模式。 
 
命令模式的优缺点 
优点 
类间解耦。各个角色之间没有依赖关系。 
可扩展性强,命令和接收者都可以扩展。 
命令模式可以与其他模式结合使用。比如结合责任链模式实现命令族解析,结合模板方法模式减少类膨胀问题。 
 
缺点 
有类膨胀问题。命令和接收者虽然可以无限扩展,但会出现类膨胀。