1

私はビルダーを持っています:

public abstract class ScriptBuilder {
    public void buildScript() {
        this.commandList = Lists.newArrayList();
    }
    public abstract void buildSleepCommand(long time);
    public abstract void buildSynchronizationCommand();
    public abstract void buildTouchDownCommand(TouchPoint touchPoint);
    public abstract void buildTouchUpCommand();
    public List<String> getScript() {
        return commandList;
    }
}

実装:

public class StandardScriptBuilder extends ScriptBuilder{
…
}

新しいインターフェースを実装する新しいビルダーを構築する必要があります。この新しいインターフェースは、インターフェースScriptBuilderに基づいています。

class NewScriptBuilder extends StandardScriptBuilder{
    public void buildNewCommand(TouchPoint startTouchPoint, TouchPoint endTouchPoint) {
        buildTouchDownCommand(startTouchPoint);
        buildSynchronizationCommand();
        buildTouchDownCommand(endTouchPoint);
    }
    …
}

既存のビルダーインターフェイスを拡張し、ビルダーの利点を維持するパターンはありますか?つまり、インターフェイスを拡張すると、次のことはできなくなります。

ScriptBuilder builder = new NewScriptBuilder();
…
builder.buildNewCommand;

解決策がない場合は、通常使用しますか?:

((NewScriptBuilder)builder).buildNewCommand;

どうも。


つまり、たとえば、デコレータパターンを使用できます。

public abstract class Decorator extends ScriptBuilder {...} ...

public class OahDecorator extends Decorator {
...
    public void buildNewCommand() {
    ...
    }
}

それは通常のコード構成ですか、それとも別のパターンを選択しますか?タスク-ビルダーに新しいメソッドを追加します。

4

3 に答える 3

1

クラスに複数の動作を実装する場合は、複数のインターフェイスを実装する必要があります。クラスに対してコーディングするのは一般的に悪い習慣です。代わりにインターフェースに対してコーディングする必要があります。違いは微妙ですが、それでもかなり関連性があり現実的です。

明示的にキャストしていることに気付いた場合、それは通常、インターフェイスがそのタスクにあまり適していないことを意味します。目標は、処理しているオブジェクトの実際の型について、クライアント コードができるだけ認識しないようにすることです。

于 2012-07-09T06:27:43.953 に答える
0

インターフェイスを使用するという考え方は、実装の型が何であるかは気にせず、サブクラスで特定のメソッドを実行する必要がないということです。サブクラス固有のメソッドを呼び出す必要がある場合は、上記のようにダウンキャストする必要があります。

于 2012-07-08T17:54:14.007 に答える
0

呼び出したいという事実builder.buildNewCommand()は、それがタイプであることをすでに知っていることを意味しますNewScriptBuilder。それを宣言してみませんNewScriptBuilderか?

NewScriptBuilder builder = new NewScriptBuilder();
...
builder.buildNewCommand();

これが不可能な場合 (外部 API を使用している可能性がありますか?)、ScriptBuilder拡張する代わりにラップすることができます。

public class NewScriptBuilder {
  private final ScriptBuilder builder;

  public NewScriptBuilder(ScriptBuilder builder) {
    this.builder = builder;
  }

  public void buildNewCommand(TouchPoint startTouchPoint, TouchPoint endTouchPoint) {
    builder.buildTouchDownCommand(startTouchPoint);
    builder.buildSynchronizationCommand();
    builder.buildTouchDownCommand(endTouchPoint);
  }
}

使用するたびに新しいインスタンスを作成しますbuildNewCommand

ScriptBuilder builder = ...;
NewScriptBuilder newBuilder = new NewScriptBuilder(builder);
newBuilder.buildNewCommand();
于 2012-07-09T07:50:59.127 に答える