访问者模式不涉及任何转换。这就是重点。
以下是 Visitorised 价值观家族的核心:
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() + ")");
}
}
您可以将 anOutputter
与混合值的集合或特定类型的集合一起使用:
List<Value> mixedValues = /* whatever */;
outputter.accept(mixedValues);
List<MeanValue> meanValues = /* whatever */ ;
outputter.accept(meanValues);