gpt4 book ai didi

java - 根据对象实例显示自定义编辑器的设计模式是什么?

转载 作者:行者123 更新时间:2023-12-04 05:06:39 24 4
gpt4 key购买 nike

我有几个对象都扩展了 Shape基础类。对于每个对象我想显示一个不同的对象editor ,例如 Line具有与 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
}
}

最佳答案

VisitorPattern cannot be used here as I would have the Shapes implement some kind of interface Visitable which would force them to implement a edit(IEditorVisitor) method, and by this pollute the domain model with information about how it will be displayed in UI.



好吧,不,它不必提供有关如何显示或编辑的域模型信息。它只需要给出它被访问的领域模型知识。

只是不要命名您的访问者界面 IEditorVisitor并且不要命名 IVisitable方法 edit .

访客非常适合这类问题。

我会这样做更像:
public interface IVisitableShape {
void accept(IShapeVisitor v);
}

public interface IShapeVisitor {
void visit(Line line);
void visit(Rectangle rectangle);
}

public class Line extends Shape implements IVisitableShape {

@Override
public void accept(IShapeVisitor v) {
v.visit(this);
}
}

public class EditorImpl implements IShapeVisitor {
public void visit(Line line) {
//show the line editor
}
public void visit(Rectangle rect) {
//show the rectangle editor
}
}

请注意,这本质上相当于您的实现草图,只是更改名称,因此编辑功能仅在编辑器中。

函数名称 acceptvisit常用来描述这种模式,并反射(reflect)这种模式。它们当然可以更改,但我认为没有必要,而且最好不要将它们明确绑定(bind)到编辑功能。

关于java - 根据对象实例显示自定义编辑器的设计模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15451546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com