0

コマンド デザイン パターンを使用するオブジェクトのコレクションがあります。つまり、オブジェクトは抽象Commandクラスを実装し、execute()メソッドを持っています。

(たとえば) コマンド ラインから呼び出された場合、次のようなことができますが、非常に面倒です。これをどのように実装しますか。

public void main(String[] arg) {
    Command c = null;

    if(arg[0].equals("FirstCommand") {
        c = new FirstCommand(arg[1]);
    }
    if(arg[0].equals("SecondCommand") {
        c = new SecondCommand(arg[1], arg[2]);
    }
    if(arg[0].equals("ThirdCommand") {
        c = new ThirdCommand(arg[1], Long.parseLong(arg[2]));
    }
    //.....etc....
    c.execute();
}

明らかに、使用可能なコマンドのリストが増えるにつれて、これは非常に退屈なコードになります。

4

2 に答える 2

0

使用可能なコマンドを追跡する必要がない一般的な解決策は、コマンドのインスタンス化にリフレクションを使用することです。パラメーターのリストを受け取るコンストラクターを用意するか、McDowell が提案したように実行メソッドを定義します。これは、同じコマンドを同じ引数で複数回再実行するかどうか、およびコマンドがキャッシュされた結果の恩恵を受けるかどうか (ステートレスとステートフル) によって異なります。

コマンド名は、クラスの単純な名前になります。パッケージを追加して完全修飾名を作成し、次に class.getConstructor(Class[] params) を追加してそのコンストラクターを呼び出します (または、execute メソッドにパラメーターを渡すことを選択した場合は、デフォルトのコンストラクターを使用します)。

于 2012-04-12T12:25:11.140 に答える