從命令模式(Command)看編程(2)

發表于:2013-09-01來源:Csdn作者:shuangde800點擊數: 標簽:命令模式
1.命令模式的本質是對命令進行封裝,將發出命令的責任和執行命令的責任分割開。 2.每一個命令都是一個操作:請求的一方發出請求,要求執行一個操作

  1.命令模式的本質是對命令進行封裝,將發出命令的責任和執行命令的責任分割開。

  2.每一個命令都是一個操作:請求的一方發出請求,要求執行一個操作;接收的一方收到請求,并執行操作。

  3.命令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否被執行、何時被執行,以及是怎么被執行的。

  4.命令模式使請求本身成為一個對象,這個對象和其他對象一樣可以被存儲和傳遞。

  5.命令模式的關鍵在于引入了抽象命令接口,且發送者針對抽象命令接口編程,只有實現了抽象命令接口的具體命令才能與接收者相關聯。

  撤銷命令模式

  要在遙控器加上撤銷功能很簡單,它的功能是這樣的:比如說是電燈關閉的,你按下了開啟按鈕,電燈就亮了,然后你按下撤銷按鈕,燈就又不亮了。相當與撤銷上一次的命令。

  1. 在Command接口上加上undo()方法

  [java] view plaincopypublic interface Command {

  public void execute();

  public void undo();

  }

  2. 如果是開燈的命令,那么他的撤銷命令就是關燈。同理,如果是關燈的命令,那么他的撤銷命令就是開燈。

  [java] view plaincopy// 開燈命令

  public class LightOnCommand implements Command{

  Light light;

  public LightOnCommand(Light light) {

  this.light = light;

  }

  public void execute() {

  light.on();

  }

  // 實現了撤銷功能:變成關燈

  public void undo(){

  light.off();

  }

  }

  [java] view plaincopy// 關燈命令

  public class LightOffCommand implements Command{

  Light light;

  public LightOffCommand(Light light) {

  this.light = light;

  }

  public void execute() {

  light.off();

  }

  // 關燈的撤銷命令是開燈

  public void undo(){

  light.on();

  }

  }

  要實現命令模式的撤銷功能,還是很簡單的,只要學會了保存上一次的命令,那么隨便就可以寫出來了

  宏命令模式

  如果遙控器擁有一個功能,按下一個按鈕,就可以實現很多功能,要怎么做?

  也很簡單,用一個數組存下所有命令即可

  [java] view plaincopypublic class MacroCommand implements Command {

  Command[] commands;

  public MacroCommand(Command[] commands) {

  this.commands = commands;

  }

  public void execute() {

  for(int i = 0; i < commands.length; i++)

  commands[i].execute();

  }

  public void undo() {

  for(int i = 0; i < commands.length; ++i)

  commands[i].undo();

  }

  }

  如果要可以撤銷很多次怎么做?

  也很簡單,不只是記錄最后一個被執行的命令,而使用一個堆棧記錄操作過程的沒一個命令。然后不管什么時候按下了撤銷按鈕,你都可以從堆棧中取出最上層的命令,然后調用它的undo()方法。

  命令模式的更多用途: 隊列請求

  命令可以將運算塊打包,然后把它傳來傳去,就像是一般的對象一樣。即使命令對象被創建許久之后,運算依然可以被調用。

  事實上,它甚至可以在不同的線程中被調用。我們利用這樣的特性衍生出一些應用,例如:日程安排(Scheduler),線程池,工作隊列等。

  命令模式的更多用途:日志請求

  某些應用需要把所有動作都記錄在日志中,并能在系統死機后,重新調用這些動作恢復到之前的狀態。

  通過新增兩個方法(store(), load() ),命令模式就能夠支持這一點。

  在只要當我們執行命令時,將歷史記錄存儲在磁盤中,一旦系統死機,就可以將命令對象重載,并成批地一次調用這些

  對象的execute()方法。

 

原文轉自:http://blog.csdn.net/shuangde800/article/details/9840259

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97