Shape
基本クラスを拡張するオブジェクトがいくつかあります。オブジェクトごとに、異なるオブジェクトを表示したいと思いますeditor
。たとえば、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
}
}