命令模式

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

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息