1.概念html
未来自客户端的请求传入一个对象,从而使你可用不一样的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现两者之间的松耦合,以便适应变化。分离变化与不变的因素。java
在面向对象的程序设计中,一个对象调用另外一个对象,通常状况下的调用过程是:建立目标对象实例;设置调用参数;调用目标对象的方法。缓存
但在有些状况下有必要使用一个专门的类对这种调用过程加以封装,咱们把这种专门的类称做command类。ide
Command模式可应用于
a)整个调用过程比较繁杂,或者存在多处这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。
b)调用先后须要对调用参数进行某些处理。
c)调用先后须要进行某些额外处理,好比日志,缓存,记录历史操做等。post
Command模式有以下效果:
a)将调用操做的对象和知道如何实现该操做的对象解耦。
b)Command是头等对象。他们能够像其余对象同样被操做和扩展。
c)你可将多个命令装配成一个符合命令。
d)增长新的Command很容易,由于这无需改变现有的类。测试
2.UMLthis
3.应用设计
例子: 模拟安装向导的上一步,下一步,command具体类中的execute模仿下一步,unexecute模仿上一步,在其实现逻辑中能够完成上一步或下一步要操做的逻辑。日志
command类:code
public abstract class Command { public abstract void execute(); public abstract void unexecute(); }
command具体类:
public class ConcreateCommand extends Command{ Reciver reciver; int id; public void setID(int id){ this.id=id; } public ConcreateCommand(Reciver reciver,int id){ this.reciver = reciver; this.id=id; } public void setReciver(Reciver reciver) { this.reciver = reciver; } @Override public void execute() { // TODO Auto-generated method stub System.out.println("command id:"+id); reciver.doComand(); } @Override public void unexecute() { // TODO Auto-generated method stub System.out.println("command id:"+id); reciver.undoCommand(); } }
Reciver命令接受者:
public abstract class Reciver { public abstract void doComand(); public abstract void undoCommand(); }
Reciver命令接受者具体类:
public class ConcreateReciver extends Reciver{ @Override public void doComand() { // TODO Auto-generated method stub System.out.println("do command~"); } @Override public void undoCommand() { // TODO Auto-generated method stub System.out.println("undo command~"); } }
Invoker 命令调用者类:
public class Invoker { private int postion; List<Command> list; public boolean check(){ return postion==list.size()-1; } public int getPostion(){ return postion; } public int commandListSize(){ return list.size(); } public Invoker(){ list=new ArrayList<Command>(); postion=-1; } /** * 添加命令 * @param command */ public void addAction(Command command){ list.add(command); } /** * ,相似于安装向导中的下一步 */ public void doAction(){ postion+=1; list.get(postion).execute(); } /** * 相似于安装向导中的上一步 */ public void undoAction(){ if(!(postion<0)){ list.get(postion).unexecute(); postion-=1; } } }
测试类:
public static void main(String[] args) { // TODO Auto-generated method stub Reciver reciver=new ConcreateReciver(); Invoker invoker=new Invoker(); Scanner s=new Scanner(System.in); int flag; int num=0; while(true){ flag=s.nextInt(); if(flag==1){ if(invoker.check()){ invoker.addAction(new ConcreateCommand(reciver,num)); } invoker.doAction(); num++; }else if(flag==2){ invoker.undoAction(); }else{ break; } } s.close(); }
参考:
http://www.cnblogs.com/devinzhang/archive/2012/01/06/2315235.html