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