1

私は次の基本インターフェースを持っています:

public interface Value{

double getValue();
}

値のCONCRETEタイプに基づいて、コレクションを取得して出力するいくつかの異なるOutputterインターフェイスが必要なので、他に10個の重要なフィールドを持つValueクラスを作成できます。これも出力する必要があります。これはVisitorパターンにうまく当てはまると思いますが、私の懸念は次のとおりです。各出力機能は常に1つの特定のタイプの値のリストを取得するため、理論的には、MeanValue、StdDevValueなどのタイプ付きリストを提供できます。値は別のインターフェイスによって生成されるため、これを適切に設計する方法を確認してください。実際、私はCollectionへの参照のみを保持しており、それをダウンキャストしてからOutputterで特定のメソッドを呼び出したくありません...

4

2 に答える 2

1

ビジターパターンにはキャストは含まれません。それがポイントです。

訪問者の価値観の家族の核心は次のとおりです。

interface Value {
    double getValue();
    void accept(ValueVisitor visitor);
}

interface ValueVisitor {
    public void visit(MeanValue value);
    public void visit(StdDevValue value);
}

class MeanValue implements Value {
    @Override
    public double getValue() {
        // whatever
    }

    @Override
    public void accept(ValueVisitor visitor) {
        visitor.visit(this);
    }
}

class StdDevValue implements Value {
    @Override
    public double getValue() {
        // whatever
    }

    public int getDegreesOfFreedom() {
        // here's a subclass-specific method
    }

    @Override
    public void accept(ValueVisitor visitor) {
        visitor.visit(this);
    }
}

出力ビットは次のとおりです。

abstract class Outputter implements ValueVisitor {
    public void output(Collection<? extends Value> values) {
        for (Value value : values) {
            value.accept(this);
        }
    }
}

class PrintingOutputter extends Outputter {
    @Override
    public void visit(MeanValue value) {
        System.out.println("Mean: " + value.getValue());
    }

    @Override
    public void visit(StdDevValue value) {
        System.out.println("Std Dev: " + value.getValue() + " (" + value.getDegreesOfFreedom() + ")");
    }
}

Outputter混合値のコレクション、または特定の種類のコレクションのいずれかでを使用できます。

    List<Value> mixedValues = /* whatever */;
    outputter.accept(mixedValues);

    List<MeanValue> meanValues = /* whatever */ ;
    outputter.accept(meanValues);
于 2012-12-18T12:54:15.030 に答える
0

これは単なる多型ではありませんか?つまり、各具象クラスをOutputter適切に実装する必要があります。

public interface Outputter {
   String output(); // implement this...
}

ビジターパターンは、呼び出し側クラスと呼び出されたクラスの間の仲介用に設計されています。したがって、呼び出し元のクラスはメソッドを呼び出してそれ自体を渡し、呼び出された(訪問した)クラスはback.egを呼び出します。

public interface Outputter {
   String output(Caller c); // implement this...
}

実装は次のようになります。

public String output(Caller c) {
   c.doWhatever(getValue());
   c.doAnotherThing(getAnotherValue());
}

の実装(タイプ)ごとに実装がどのように異なるかに注意してくださいOutputter

于 2012-12-18T10:00:11.020 に答える