我需要对Composition模式进行各种操作。我用复合模式来管理访客模式的这些实现。
接口:
public interface Visitor {
void visit(DayPart dayPart);
void visit(DayParting dayParting);
void visit(TimePart timePart);
}
复合类中的访问者方法:
public void accept(Visitor visitor) {
visitor.visit(this);
Iterator<AbstractComposite> itr = iterator();
Parting children;
while (itr.hasNext()) {
children = (Parting) itr.next();
children.accept(visitor);
}
}
叶子上的访客方法:
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
访客类实现:
public class myVisitor implements Visitor {
@Override
public void visit(DayPart dayPart) {
//do something (or not)
}
@Override
public void visit(DayParting dayParting){
// do something (or not)
}
@Override
public void visit(TimePart timePart){
//do something (or not)
}
}
问题在于我需要对作文进行各种操作,并且通过这种设计,我需要为每次“访问”我需要做的一个新课程,这是非常不切实际的。
所以,我正在考虑用内部类做这样的事情(我把通用名称)。
public abstract class VisitorImpl implements Visitor {
//Hook methods
@Override
public void visit(Composite composite) {
//hok method
}
@Override
public void visit(Composite2 composite2) {
//hook method
}
@Override
public void visit(Leaf leaf) {
//hook method
}
public static Visitor ParticularVisitor(){
return new ParticularVisitor();
}
private static class ParticularVisitor extends VisitorImpl {
@Override
public void visit(Composite composite) {
//do something real.
}
@Override
public void visit(Composite2 composite2) {
//do something real.
}
@Override
public void visit(Leaf leaf) {
//do something real.
}
}
private static class ParticularVisitor_2 extends VisitorImpl {
public ParticularVisitor_2(){
}
@Override
public void visit(Leaf leaf){
//Just do something with this
}
}
}
这是解决我问题的好方法吗?有什么改进吗?
答案 0 :(得分:4)
访客设计模式
意图
- 表示要对对象结构的元素执行的操作。
- 访问者允许您定义新操作,而无需更改其操作元素的类。
- 恢复丢失类型信息的经典技巧。
- 根据两个对象的类型做正确的事。
- 双重发送
问题
需要在节点上执行许多不同且不相关的操作 异构聚合结构中的对象。你想避免 &#34;污染&#34;具有这些操作的节点类。而且,你不想要 必须查询每个节点的类型并将指针强制转换为正确的 在执行所需操作之前键入。
来自:Sourcemaking
所以,你的问题&#34;
&#34;问题是我需要对作文进行各种操作 通过这种设计,我需要为每次访问&#34;做一个新的课程。我是什么 需要这样做,这是非常不切实际的。&#34;
不是一个问题,访问者应该如何工作。
One operation to be performed = one visitor
如果您的操作之间没有任何关系,那么您可以使用访问者做到最好。