実際に遭遇したcommandモード


Commandコマンドモードは、ソフトウェア構築中に「動作リクエスト者」と「動作実装者」が通常「緊密な結合」を示す問題を主に解決するオブジェクト動作型モードです.次の図を示します.
 
オブジェクトにリクエストを送信する必要がある場合がありますが、リクエストされた操作またはリクエストの受信者に関する情報が分からない場合は、変化の緊密な結合を防ぐことができません.たとえば、動作の記録、取り消し/やり直し、トランザクションなどの処理が必要です.我々がしなければならないのは依存関係を変換し,緊縮結合を緩和結合に変えることである.上の図の形式は次の形式に変換されます.
 
      
 
Commandモードは、要求自体をオブジェクトにすることによって、動作要求者が指定されていないアプリケーションオブジェクトに要求を提出することができる.
GoFの「設計モード」では、1つのリクエストを1つのオブジェクトにカプセル化し、異なるリクエストで顧客をパラメータ化することができます.リクエストに対してキューまたはログを記録し、取り消し可能な操作をサポートします.
Commandコマンドモード構造:
      
commandモードはclientがinvokerを呼び出し、invokerがcommandを呼び出し、commandがreceiverを呼び出し、receiverがclientに表示されます.私はRCPプロジェクトで、コマンドを実現し、undo、redo機能を持っています.例えばデータ操作クラスに
 public void editFormalParam(Client tab, Parameter pParam) {
        EditParamCommand cmd = new EditParamCommand(model);
        ........................................
        final EditParamCommand pCmd = cmd;
        SafeAction safeAction = new SafeAction(BuildingblockeditorPluginResources.SACFACTION.toString()) {
            public void runSafe() {
                getCommandStack().execute(pCmd);
            }
        };
        safeAction.run();
    }

クライアントがeditFormalParamメソッドを実行すると、commandのexecuteメソッドが実行されます.このデータ操作クラスはinvokerであり、commandのexecuteメソッドを実行します.同時にcommandクラスで実現しました
public class EditParamCommand {
   private Model model;
   private Object new;
   private Object old;
   public EditorParamCommand(Model model,Object new,Object old){
     this.model=model;
     this.new=new;
     this.old=old;
   }
   public void execute(){
    model.get...;
    mode.set...;
  }
   public void redo(){
    model.set(new);
   }
  public void undo(){
    model.set(old);
  }
}

ここのモデルはreceiverです.そしてmodelが変化したデータをclientに返し、リフレッシュします.