Command Pattern


コマンドモードの例



コマンド・オブジェクトは、特定の受信および関連付けられた一連の動作によって需要をカプセル化します.
次のコード例では、SimpleRemoteControlはInvokerクラス、LightOnCommnadはCommandクラス、LightはReceiverクラス、RemoteControlTestはクライアントクラスである.
reference code
SimpleRemoteControl.java (Invoker)SimpleRemoteControlは、Commandオブジェクトを含む.ボタンが押されると、Command関数が呼び出され、実際のオブジェクトが何であれ、何をしているかにかかわらず呼び出されます.
public class SimpleRemoteControl {
    Command slot;

    public SimpleRemoteControl() { }

    public void setCommand(Command command) {
        this.slot = command;
    }

    public void buttonWasPressed() {
        slot.execute();
    }
}
Command.java
public interface Command {
    void execute();
}
LightOnCommand.java (Command)executeは、トランシーバオブジェクトを参照する.このトランシーバは、クライアントから注入されるトランシーバである.
public class LightOnCommand implements Command {

    Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.on();
    }
}
RemoteControlTest.java (Client)
クライアント(Client)には、コマンドオブジェクトとコレクタオブジェクトが含まれ、コレクタオブジェクトがコマンドオブジェクトに注入されます.したがって、LightOnCommand関数がコマンドオブジェクトで呼び出されると、注入されたコレクタオブジェクトに対して特定の操作が実行されます.
public class RemoteControlTest {

    public static void main(String[] args) {
        SimpleRemoteControl remote = new SimpleRemoteControl();
        Light light = new Light();
        LightOnCommand lightOn = new LightOnCommand(light);

        remote.setCommand(lightOn);
        remote.buttonWasPressed();

        Garage garage = new Garage();
        GarageDoorOpenCommand garageDoorOpen = new GarageDoorOpenCommand(garage);

        remote.setCommand(garageDoorOpen);
        remote.buttonWasPressed();
    }
}

カスタムパターン(Command Pattern)の定義


「Head First Design Patterns」で定義したコマンド・アレイの定義は次のとおりです.
コマンドモード(Command Pattern)
コマンドモードを使用して、要求をオブジェクトにカプセル化するか、パラメータを使用して異なる要求を受け入れることができます.また、リクエスト履歴をキューに保存したり、ログとして記録したりして、キャンセル操作をサポートすることもできます.

コマンド・モードの使用


リクエストをキューに保存


カスタムオブジェクトを使用すると、計算された一部をパッケージ化(トランシーバと一連の動作)し、オブジェクトとして渡すこともできます.これは、スケジューラ、スレッドプール、およびタスクキューに使用できます.
ワークキューを表示すると、コマンド・オブジェクトがキューに積み重ねられ、どのような操作が行われているか分かりません.次に、コマンドがどのような操作を実行しても、コマンドオブジェクトexexcuteを順次インポートして呼び出す.

要求をログに書き込む


アプリケーションのダウンタイム時に古いレコードを復元する機能を追加できます.executeインターフェースにCommandおよびstore()が追加され、load()が呼び出されるたびにexecute()が実行される.アプリケーションが停止した場合は、store()でリカバリできます.
しかし、データ構造の膨大なアプリケーションでは、関数load()のオーバーヘッドがますます大きくなります.この場合は、リクエストをログに書き込んでください.アプリケーションがダウンタイムした場合、ログ・リカバリ・システムを使用できます.