天天看點

GOF23設計模式之指令模式(Command)的了解與實作

      
指令模式Command      
     指令模式:将一個請求封裝為一個對象,進而使我們可用不同的請求對客戶進行參數化;對請求排毒或者記錄請求日志,以及支援可撤銷的操作。也稱之為:動作Action模式,事務Transaction模式      
結構:      
     Command抽象指令類      
     ConcreteCommand具體指令類      
     Invoker調用者/請求者      
         請求的發送者,它通過指令對象來執行請求,一個調用者并不需要在設計時确定其接收者。是以它至于抽象指令類之間存在慣量。在程式運作時,将調用指令對象的execute(),間接調用接收者的相關操作。      
     Receiver接收者:      
         接收者執行與請求相關的操作,具體實作對請求的業務處理      
         未抽象前,實際執行操作内容的對象。      
     Client客戶類。      
         在客戶類中需要建立調用者對象,具體指令類對象,在建立具體指令對象時指定對應的接收者。      
發送者和接收者之間沒有直接關系,都通過指令對象間接調用。      
場景:      
         Struts2中,action的整個調用過程中就有指令模式      
         資料庫事務機制的底層實作      
         指令的撤銷和回複。      
================================================      
/**
 * 指令的真實執行者。
 * 時間:2015年4月14日19:32:27
 * 
 */
package com.bjsxt.cn.command;      
import java.rmi.activation.ActivationGroupDesc.CommandEnvironment;      
public class Receiver {
 
 
 public void action() {
  System.out.println("我作為接收者,是實際的指令執行者。");
  System.out.println("Receiver.action()");
 }
 
}      
===========================================      
/**
 * 抽象指令類
 */
package com.bjsxt.cn.command;      
/**
 * 這個方法是一個傳回結果為空的方法
 * 實際項目中,可根據需求設計多個不同的方法。
 * @author wanna_000
 *
 */
public interface Command {
 public void execute();
}      
class ConcreteCommand implements Command {      
 private Receiver receiver;
 
 
 public ConcreteCommand(Receiver receiver) {
  super();
  this.receiver = receiver;
 }      
 @Override
 public void execute() {
  //在調用前後做一些我需要的處理
  receiver.action();
 
 }
 
}      
==============================================      
/**
 * 調用者/發起者
 */
package com.bjsxt.cn.command;      
public class Invoker {
 //也可以通過List<Command>容納很多指令,進行批處理,資料庫底層的事務管理就是這種模式。
 private Command command;      
 public Invoker(Command command) {
  super();
  this.command = command;
 }
 //業務方法,用于調用指令類的方法
 public void call() {
  command.execute();      
 }
}      
================================================      
/**
 * 客戶程式類:測試指令模式的使用 
 */
package com.bjsxt.cn.command;      
public class Client {
 public static void main(String[] args) {
  Receiver receiver = new Receiver();
  Command command = new ConcreteCommand(receiver);
  Invoker invoker = new Invoker(command);
  invoker.call();
 }
}      
/*
我作為接收者,是實際的指令執行者。
Receiver.action()      
 * 
 */