アイデア
コマンドを作成する必要があります。コマンドはパラメーターを使用して構成できます。すべてのコマンドが同じパラメーターを受け取ることができるわけではありません。したがって、一部は無視する必要があります。
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を使用することに本当に「熱心」ではないからです。