我有几个对象都扩展了一个Shape
基本类。对于我想要显示不同对象的每个对象editor
,例如 a 与 aLine
具有不同的要编辑的属性Rectangle
。
class Shape;
class Line extends Shape;
class Rectangle extends Shape;
List<Shape> shapes;
void onEditEvent(Shape shape) {
new ShapeEditorPopup(shape);
//how to avoid instanceof checks here
}
对于每个实现,Shape
只有一个Editor
实现。我可以在这里使用什么模式:根据形状实现类型 ( instanceof
) 为形状显示正确的编辑器?
我不希望Shapes
(域模型)自己知道哪个编辑器是正确的。
StrategyPattern
不能在这里使用,因为onEditEvent()
它必须知道形状是哪个实现,并相应地传递策略。
VisitorPattern
不能在这里使用,因为我将Shapes
实现某种interface Visitable
强制他们实现edit(IEditorVisitor)
方法的实现,并由此污染域模型,其中包含有关如何在 UI 中显示的信息。
我还能在这里做什么?
更新:
我如何使用访问者模式的示例(尽管我不喜欢它,因为我必须用edit(editor)
方法之类的东西“污染”域模型。我想避免这种情况。
interface Editable {
public void edit(IEditor editor);
}
public interface IEditor {
public void edit(Shape shape);
}
class Line extends Shape implements Editable {
@Override
public void edit(IEditor editor) {
editor.edit(this);
}
}
class EditorImpl implements IEditor {
void edit(Line line) {
//show the line editor
}
void edit(Rectangle rect) {
//shwo the rectangle editor
}
}