首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访客与构图

访客与构图
EN

Stack Overflow用户
提问于 2017-01-09 07:36:41
回答 3查看 392关注 0票数 0

在我看来,访问者的设计模式非常类似于构图的工作方式。在组合中,我将在类中持有一个接口成员,并在构造函数中传递接口的具体实现,然后将一个方法委托给它,或者在类中使用它。

在访问者设计模式中,我也有一个接口的具体实现,并将它发送到访问方法,然后将访问方法委托给它。

要在代码中显示这种相似性,访问者应该如下:

代码语言:javascript
复制
VisitorInterface v = new ConcreteVisitor();
MyClass c = new MyClass();
c.visit(v);
VisitorInterface dv = new DifferentVisitor();
c.visit(dv);

其组成如下:

代码语言:javascript
复制
SomeInterface i = new ConcreteImplementation();
MyClass c = new MyClass(i);
c.visit();  // called visit just to show the symmetry to visitor pattern
SomeInterface di = new DifferentImplementation();
c.changeReference(di);
c.visit(); 

我想听听你对哪一种情况比另一种更喜欢的想法,以及为什么

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-09 07:50:28

组合是表示对象之间关系的一种方法,换句话说,是对对象的属性进行建模。牛有角。注射对此并不重要。访问者模式是对类型执行外部操作的一种方法。它们服务于不同的目的,并对对象模型的不同部分进行操作。为了回答您的问题,我更喜欢组合,当情况的逻辑要求类型具有属性时,访问者模式组织代码来对类型的实例执行操作,而不改变目标类型的结构,就像为该模式记录的那样。

票数 3
EN

Stack Overflow用户

发布于 2017-01-09 09:55:33

“游客设计模式非常类似于构图工作的方式。”

其实并非如此。构图是抽象、封装、多态等对象生成的基本原则,它是一个简单的--关系适配器复合装潢工模式是利用合成原理的完美范例。

访问者模式是从基本编程原则推导而来的高级解决方案。访客背后的基本逻辑是基于不同子类类型的方法重载。

例:您有一个基类或接口,名为和子类Crow、DuckPenguin。您需要某个客户端类的方法来执行不同的w.r.t操作。子类的类型。这里假设,我想要一个Hunter类,其中区分了Hunter.hunt()方法w.r.t的行为。无论是乌鸦,鸭子还是企鹅

所以我的亨特类是这样的。

代码语言:javascript
复制
public class Hunter{

    public void hunt(Crow crow){
        //crow hunting logic.
    }

    public void hunt(Duck duck){
        //duck hunting logic.
    }

    public void hunt(Penguin penguin){
        //penguin hunting logic.
    }

}

如果我真的喜欢这个,

代码语言:javascript
复制
Bird bird = new Duck();
Hunter hunter = new Hunter();

hunter.hunt(bird);

现在,这个hunter.hunt();将自动导航到hunt(Duck duck)方法并被执行。

我想你明白,组成原则和访客模式之间没有多大关系。

最后,访问者在一般中并不是一个好的模式。原因是,当添加不同的新子类时,它使您不断地重载越来越多的方法。在我们的示例中,如果您想添加新的类,如鸽子、鹰等,则必须添加方法hunt(Pigeon pigeon)hunt(Eagle eagle)。这将是一个可怕的大规模维护问题,尤其是。所以,如果你只在没有其他选择或者没有反弹的情况下使用它,那就更好了。

票数 1
EN

Stack Overflow用户

发布于 2017-01-09 12:23:35

也许您应该考虑在什么地方使用所述的模式,以便理解其中的区别:

复合

将对象组合成树结构来表示对象的部分整体hierarchies.Group,其处理方式与对象的单个实例相同。

绘图示例(java中的swing库):绘图可以由图形原语(如线条、圆圈、矩形、文本等)组成(组合)。但是为了绘制,我们用处理原始对象的方式完全相同地操作组合。

访客

允许在运行时将一个或多个操作应用于一组对象,从而使操作与对象结构分离。

基本思想是拥有相同的机制,如何遍历对象结构(对象结构可以是树,看起来类似于组合),然后在每一步通过结构中的对象,我们可以有一个或多个操作,

在编译器中,AST是对象结构,访问者可以用来遍历AST并生成二进制代码,或者XML输出或.

希望这能帮上忙

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41543074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档