JavaRush /Java Blog /Random-JA /自分の言葉で表現したコマンドパターン
Roman_kh
レベル 33
Харьков

自分の言葉で表現したコマンドパターン

Random-JA グループに公開済み

フォーラムメンバーの皆さん、こんにちは!

私はそのパターンを徹底的に理解した(ように見える)Commandので、それについて「自分の言葉で」語ってみたいと思います。 Wikipedia によると、その目的は、送信側クラスと受信側クラスが互いに直接依存しない構造を作成することであることが自分の言葉で表すコマンドパターン - 1わかります。送信者クラスを含むクラスへのコールバックを構成します。原則的には明確かつ正確に書かれていますが、これは理論上の話です。これを行う方法?ここから問題が始まります。なぜなら... 説明はもはやそれほど明確で明白ではありません。したがって、私はそれを理解しました、私がそれをどのように理解したかを伝えることにしました。おそらく誰かの役に立つでしょう:このパターンの目的の説明に基づいて、説明をコードと組み合わせてより明確にします。なぜなら 同じウィキペディアでは、多くの言語に対してそれを一般化しているため、説明は例から分離されています。commandこのパターンには 4 つの用語があります。ここではコマンド ( )、コマンド受信者 ( receiver)、コマンド呼び出し元 ( invoker)、およびクライアント ( )という 4 つの用語があると考えてくださいclient。同じウィキペディアから例を取り上げますが、これはかなり許容範囲です。 このタスクは、Lightライトをオンにすることとオフにするという 2 つのことを実行できる クラスです。パターン的には「コマンドレシーバー(receiver)」 となります。
/*Receiver class*/

public class Light{
     public Light(){  }

     public void turnOn(){
        System.out.println("The light is on");
     }

     public void turnOff(){
        System.out.println("The light is off");
     }
}
実行され、「command ( )」 パターンexecute()で呼び出される 1 つのメソッドを含むインターフェイスを作成しましょう。command
/*the Command interface*/

public interface Command{
    void execute();
}
クラス スキルの実行をカプセル化する必要がありますLight。これを行うには、インターフェイスを実装しTurnOnLightCommand、コンストラクターでクラス オブジェクトを受け入れるクラスを作成します。そして、それぞれが 1 つのアクションだけを実行します。1 つはメソッドを呼び出し、もう 1 つは を呼び出します。 TurnOffLightCommandCommandLightturnOn()turnOff()
/*the Command for turning on the light*/

public class TurnOnLightCommand implements Command{
   private Light theLight;

   public TurnOnLightCommand(Light light){
        this.theLight=light;
       }

   public void execute(){
      theLight.turnOn();
   }
}

/*the Command for turning off the light*/

public class TurnOffLightCommand implements Command{
   private Light theLight;

   public TurnOffLightCommand(Light light){
        this.theLight=light;
       }

   public void execute(){
      theLight.turnOff();
   }
}
次に、これらのカプセル化されたオブジェクト メソッドを受け入れるオブジェクトを作成しますLight。パターン的にはコマンド呼び出し元(呼び出し元)と呼ばれます。これを呼び出して、作成されたメソッドとで使用されるSwitchコンストラクター内の変数を受け入れられるようにしましょう。 CommandflipUp()flipDown()
/*the Invoker class*/

public class Switch {
    private Command flipUpCommand;
    private Command flipDownCommand;

    public Switch(Command flipUpCommand,Command flipDownCommand){
         this.flipUpCommand=flipUpCommand;
         this.flipDownCommand=flipDownCommand;
    }

    public void flipUp(){
         flipUpCommand.execute();
    }

    public void flipDown(){
         flipDownCommand.execute();
    }
}
そしてもちろん、一般的に何が起こっているのかを理解するためにそれらを使用するクラスを作成します。これは main メソッドと呼ばれ、すべてのアクションが実行されます。
/*The test class*/
public class TestCommand{
   public static void main(String[] args){
       // создаем an object, который будет использоваться
       Light l=new Light();
       // создаем an objectы для всех умений an object Light:
       Command switchUp=new TurnOnLightCommand(l);
       Command switchDown=new TurnOffLightCommand(l);

       // Создаемтся invoker, с которым мы будем непосредственно контактировать:
       Switch s=new Switch(switchUp,switchDown);

       // вот проверка этого, используем методы:
       s.flipUp();
       s.flipDown();
   }
}
出力は次のようになります。
"The light is on"
"The light is off"

これはどこに適用されますか?

これが必要な理由と目的は明確です。つまり、特定の実行を分離する必要がある状況では、これは非常に便利です。そのため、一部の機能の使用は特定の実装に依存せず、システムに損傷を与えることなく変更できます。このようなもの...) コメントを書いてください。話し合ってください。もっとシンプルにして、より良く伝えることができるかもしれません。必要に応じてすべて編集します) 初めて読む人にとって、できるだけ明確になるように。まあ、記事を気に入ってくれた人は誰でもそれに「+」を付けてください:) これは私にとって重要です) 時間が経つにつれて、 やその他についてもっと書きたいと思いBuilderますSingleton私の他の記事も参照してください。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION