設計モードのコマンドモード--基礎編

5450 ワード

0 x 01はじめに
閻宏博士の『JAVAとモード』の冒頭には、命令(Command)モードが記述されている.命令モードは対象の行動モードである.コマンドモードは、アクションモードまたはトランザクションモードとも呼ばれる.(これ..哲♂学習モード,emmmm)コマンドモードは,要求または操作をオブジェクトにカプセル化する.コマンド・モードを使用すると、システムは異なるリクエストを使用してクライアントをパラメータ化し、リクエストにキューを並べたり、リクエスト・ログを記録したりすることができ、コマンドの取り消しとリカバリ機能を提供することができます.
0 x 02コマンドモードの構成
Commandはコマンドのインタフェースを定義し、実行方法を宣言します.
ConcreteCommandコマンドインタフェース実装オブジェクトは、「虚」の実装である.通常、受信者は保持され、受信者の機能を呼び出してコマンドの実行を完了します.
Receiver受信者、本当にコマンドを実行するオブジェクト.任意のクラスは、コマンド要件が実装される対応する機能を実現できる限り、受信者になる可能性があります.
Invokerはコマンドオブジェクトに要求を実行するように要求し,通常はコマンドオブジェクトを持ち,多くのコマンドオブジェクトを持つことができる.これは、クライアントが本当にコマンドをトリガし、コマンドに対応する操作を要求する場所、すなわちコマンドオブジェクトを使用するエントリに相当する.
Clientは、特定のコマンドオブジェクトを作成し、コマンドオブジェクトの受信者を設定します.これは私たちの通常の意味でのクライアントではなく、コマンドオブジェクトと受信者を組み立てることに注意してください.もしかすると、このClientをアセンブリと呼ぶと、本当にコマンドを使用しているクライアントはInvokerから実行をトリガーしているので、より理解しやすいかもしれません.
0 x 03コード構造
//         
public interface Command {
    /**
     *     
     */
    void execute(); 
}
//        
public class ConcreteCommand implements Command{
    //          
    private Receiver receiver = null ;
    //     
    public ConcreteCommand(Receiver receiver) {
        if (receiver != null ) {
            this.receiver = receiver;
        }
    }
    @Override
    public void execute() {
        //             ,            。
        receiver.action();
    }   
}
//       
public class Receiver {
    /**
     *            
     */
    public void action(){
        System.out.println("    ");
    }
}
//    
public class Invoke {
    /**
     *       
     */
    private Command command = null ;
    
    public Invoke(Command command) {
        if (command != null) {
            this.command = command;
        }
    }
    /**
     *     
     */
    public void action(){
        command.execute();
    }
}
//    
public class Client {
    
    public static void main(String[] args) {
        //      
        Receiver receiver = new Receiver() ;
        
        //       ,       
        Command concreteCommand = new ConcreteCommand(receiver);
        
        //      
        Invoke invoke = new Invoke(concreteCommand);
        
        //     
        invoke.action();
    }
}

0 x 04挙個みくり
上はコマンドモードの簡単な実現ですが、今は簡単な栗を挙げてコマンドモードの具体的な応用を見る必要があります.テレビでは、テレビのスイッチコマンドを栗として見たことがあると思います.
//      
public interface Command {
    //     
    void execute();
}
//       
public class TV {
    //     
    public void turnON(){
        System.out.println("    !");
    }
    //     
    public void turnOFF() {
        System.out.println("    !");
    }
}
//         --    
public class TvOFFCommand implements Command{
    private TV tv ;
    public TvOFFCommand(TV tv) {
        this.tv = tv ;
    }
    @Override
    public void execute() {
        tv.turnOFF();
    }
}
//         --    
public class TvONCommand implements Command{
    private TV tv ;
    public TvONCommand(TV tv) {
        this.tv = tv ;
    }
    @Override
    public void execute() {
        tv.turnON();
    }
}
//     --    
public class RemoteInvote {
    private Command ON, OFF;
    public RemoteInvote(Command ON,Command OFF) {
        this.ON = ON ;
        this.OFF = OFF ;
    }
    public void turnON() {
        ON.execute();
    }
    public void turnOFF() {
        OFF.execute();
    }
}
//    
public class Client {
    public static void main(String[] args) {
        //      
        TV receiver = new TV();
        //             
        Command onCommand = new TvONCommand(receiver);
        Command offCommand = new TvOFFCommand(receiver);
        //     --     
        RemoteInvote invote = new RemoteInvote(onCommand, offCommand);
        //     
        invote.turnON();
        //     
        invote.turnOFF();
    }
}

結果
    !
    !

0 x 05例の補足説明:
コードは多そうに見えますが、コマンドモードの構造ははっきりしています.総じて、コマンドモードの使用プロセスは、まず抽象コマンドを作成し、それから複数の具体的なコマンドを作成して抽象コマンドインタフェースを実装し、それからコマンド受信者ロールを作成します.それは、さまざまな動作の具体的な実装を含み、それからコマンド呼び出し者ロールがあります.クライアントに提供され、クライアントのパラメータを受信する.
0 x 06コマンドモードの拡張
コマンドモード編(wo)幅(bu)が長すぎるため、ここでは単独で分割します.
  • コマンドモード拡張編-マクロコマンド:時間が足りない、栗は未定、コードは
  • なし
  • コマンドモード拡張編-取り消しコマンド:時間が足りない、栗は未定、コードは
  • なし
  • コマンドモード拡張編-コマンドキュー:時間が足りない、栗は未定、コードは
  • なし
  • コマンドモード拡張編-リクエストログ:時間が足りない、栗は未定、コードは
  • なし
    お楽しみに~
    0 x 07メリットとデメリット
  • の利点
  • 1.                  ,       ,      ;
    2.                ,              ;
    3.                   ,             ;
    
  • 欠点
  • 1.        ,        ,            ,                      ;(          ,               );
    

    0 x 08適用シーン
    1.                ,      ;
    2.                ,                ,                ,        ;
    3.             ,    ,  /         ;
    4.         ,    ;
    5.           ,      ;
    

    0 x 09まとめ
    コマンドモードの最大の利点は、動作要求者と動作実現者のデカップリングを実現することである.実際のシーンでの使用:Struts 2のactionでの呼び出し中にコマンドモードが存在します.データベース内のトランザクションメカニズムの最下位実装;コマンドの取り消しとリカバリ:データベース内のトランザクションのロールバックなど、コマンドの取り消しとリカバリの方法を追加します.たとえば、JavaのRunnableはコマンドモードの変形アプリケーションです.
    public class Test {
        public static void main(String[] args) {
            //  
            Runnable runnable = () -> System.out.println("    "); // Command cmd = ConcreteCommand
            Thread thread1 = new Thread(runnable); //   cmd    Thread (Invoker)
            thread1.start(); // Invoker    cmd      
        }
    } 
    

    Tips:以上の部分の内容はインターネットから来て、削除します.