从我earlier about the usage of the visitor pattern for a shape editor的问题来看,我得出结论,我必须打破它的设计规则。
主要是因为我需要更新我的Shape
字段,所以基本上我需要将参数传递回访问者。
现在我使用ShapeObject的变量来填充UI字段。
public class Editor implements ShapeVisitor{
private Shape shape;
@Override
public Foo visit(CircleObject circle) {
// populate fields
shape = circle;
((CircleObject) shape).getText().setCaption("test");
}
@Override
public void visit(RectangleObject rectangle) {
// populate fields
shape = new RectangleObject();
}
public void setComponent(JsonArray arguments){
Element element = getFromJson(arguments);
element.getAttrs().accept(this);
}
}
在我的代码中的某个地方,我有一个Save Button,它应该更新ShapeObject。
@Override
public void buttonClick(ClickEvent event) {
element.setAttrs(shape);
}
基本上我正在做的是创建一个ShapeObject
的新实例并更新那里的字段。然后我通过element
将其传递给element.setAttrs(shape)
。
基本上我根本不需要访问者模式,因为我可以使用instanceof
方法中的setComponent
运算符实现相同的功能。我正在尽力避免使用此运算符,因为在不久的将来,我会有更多ShapeObjects
然后这两个。
我不确定这是否是我应采取的方法,或者对于自定义形状编辑器可能有更好的方法。
最好的问候。
Shape类看起来像访问者模式
public abstract class Shape {
public abstract void accept(ShapeVisitor v);
public interface ShapeVisitor{
public void visit(CircleObject circle);
public void visit(RectangleObject rectangle);
}
}
instanceof
的方法就是这个
public void setComponent(JsonArray arguments){
Element element = getFromJson(arguments);
if(element.getAttrs() instanceof RectangleObject)
shape = new RectangleObject;
}