gpt4 book ai didi

java - 访问者模式还是多态?

转载 作者:行者123 更新时间:2023-11-29 07:59:19 26 4
gpt4 key购买 nike

我的项目中有一个多态结构,我在考虑重写它以使用 Visitor Pattern 是否有值(value)。

基本结构是:我有一些绘图对象 (矩形、椭圆、线,更多的是 future )当然有一些共同的行为。该行为由接口(interface) Drawable 定义。到目前为止,拖动的行为应该始终相同,但选择的绘制它们应该有所不同。

因此我引入了abstract Figure类,它已经实现了drag(),但是将drawSelected()的实现委托(delegate)给扩展类类。

当然,该接口(interface)稍后会扩展我需要的附加功能,并且还会有附加的 Figures 实现。

现在我的问题是:您是愿意坚持这种设计,还是切换到 Visitor。如果是这样,为什么?特别是我不确定我目前的方法是否适合在对象本身内部绘制选择的逻辑/算法。

interface Drawable {
void drag();
void drawSelected();
}


abstract class Figure implements Drawable {
protected int x, y, w, h;

@Override
void drag() {
//implementation always the same for different figures
}
}


class Rectangle extends Figure {
@Override
drawSelected() {
//draw a dashed rectangle around this object
}
}

class Ellipse extends Figure {
@Override
drawSelected() {
//draw a dashed ellipse around this object
}
}

class Line extends Figure {
@Override
drawSelected() {
//draw the line itself dashed
}
}

最佳答案

您遇到的问题需要使用不太可能随时间变化的对象结构;可能会添加新的结构(图形),但给定的对象结构(图形)不太可能改变。尽管结构可能不会改变,但您可以在结构上添加越来越多的操作,这些操作可能在结构中通用,也可能不通用。我认为这些东西构成了使用 Visitor 模式的用例。

为了进一步详细说明,请考虑您要添加新操作的场景,其中您需要对一组图形执行一个实现,对另一组图形执行另一个实现,依此类推。在当前的设计中,您可能只能在抽象类中拥有一个通用实现(除非您使用 instanceOf,但这又不被认为是一种好的做法)并且必须在每个其他类(class)。在使用 Visitor 模式的情况下,您将始终调用 visit 方法(将在运行时绑定(bind)),并且您可以在其中决定调用哪个实现。

在当前的设计中,您可能还会遇到这样一种情况,即您在不同的类中有共同的逻辑。但是在Visitor模式中,您可以在visitor类中维护各种实现,并在visit方法中重用它们,因此没有代码重复。

如果需要,

Visitor模式还可以让您轻松地将给定图形从一种实现切换到另一种实现。

虽然在添加新类时,您需要向访问者界面添加新的实现,但这不会影响任何现有类(图形)或其实现。

关于java - 访问者模式还是多态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15449461/

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