5

アイデア

コマンドを作成する必要があります。コマンドはパラメーターを使用して構成できます。すべてのコマンドが同じパラメーターを受け取ることができるわけではありません。したがって、一部は無視する必要があります。

Builderを定義した抽象クラスCommandがあります。デフォルトでは、すべての追加パラメーターは「UnsupportedOperationException」をスローします

public abstract class Command {

   public static abstract class CommandBuilder {

        // TODO instanceof. How to do this better?
        public CommandBuilder append(Parameter p)
            throws UnsupportedOperationException {

            if (p instanceof URLParameter)
                return append((URLParameter) p);

            if (p instanceof ActionParameter)
                return append((ActionParameter) p);

            if (p instanceof RepeatParameter)
                return append((RepeatParameter) p);

            if (p instanceof TimeOutParameter)
                return append((TimeOutParameter) p);

            return this;

        }

        public CommandBuilder append(URLParameter p)
                throws UnsupportedOperationException {

                    throw new UnsupportedOperationException(
                        "URLParameter not applicable");

        }

        public CommandBuilder append(RepeatParameter p)
            throws UnsupportedOperationException {

                throw new UnsupportedOperationException(
                    "RepeatParameter not applicable");

            }
            ...

}

パラメータを特定の具体的なコマンドに適用できるようにする場合は、FTPコマンドとしましょう。

次のようなことをする必要があります。

public class FTPCommand extends Command {

    public static class Builder extends CommandBuilder {

    @Override
    public CommandBuilder append(URLParameter p) {
            System.out.println("URLParemeter appended");
                return this;
            }
        }

}

そのため、URLParameterが指定された場合、例外はスローされず、代わりに適用されます。

ただし、このCommandBuilderのクライアントは、具体的なサブクラスを提供できない場合があります。したがって、一般的に「パラメータ」が与えられます。しかし、それは正しい場所に行く必要があります(方法)

URLParameterのように、に到達する必要がありますappend(UrlParameter p)

どうすればこれをクリーン(er)およびnice(r)の方法で行うことができますか?私はinstanceofを使用することに本当に「熱心」ではないからです。

4

2 に答える 2

7

これは、古典的なダブルディスパッチまたは訪問者のシナリオのように見えます。ダブルディスパッチリファレンスから:

呼び出しに関係する2つのオブジェクトの実行時タイプに応じて、異なる具象関数に関数呼び出しをディスパッチするメカニズム

ParameterCommandBuilder何をすべきかについて彼ら自身の間で相互作用する必要性。

CommandBuilderパラメータをコールバックできます。Parameterオブジェクトはすべて共通のインターフェースを実装し、各サブクラスの実装異なります。

public CommandBuilder append(Parameter p) {
   // the append method called depends on the underlying type of 'p'
   p.append(this);
}
于 2012-08-03T09:32:02.150 に答える
4

私はあなたのインターフェースにビジターメソッドを追加します

interface Parameter {
    public void append(CommandBuilder builder);
}

class CommandBuilder {
    public CommandBuilder append(Parameter p) {
       p.append(this);
    }
}
于 2012-08-03T09:36:23.787 に答える