在我看来,访问者的设计模式非常类似于构图的工作方式。在组合中,我将在类中持有一个接口成员,并在构造函数中传递接口的具体实现,然后将一个方法委托给它,或者在类中使用它。
在访问者设计模式中,我也有一个接口的具体实现,并将它发送到访问方法,然后将访问方法委托给它。
要在代码中显示这种相似性,访问者应该如下:
VisitorInterface v = new ConcreteVisitor();
MyClass c = new MyClass();
c.visit(v);
VisitorInterface dv = new DifferentVisitor();
c.visit(dv);其组成如下:
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(); 我想听听你对哪一种情况比另一种更喜欢的想法,以及为什么
发布于 2017-01-09 07:50:28
组合是表示对象之间关系的一种方法,换句话说,是对对象的属性进行建模。牛有角。注射对此并不重要。访问者模式是对类型执行外部操作的一种方法。它们服务于不同的目的,并对对象模型的不同部分进行操作。为了回答您的问题,我更喜欢组合,当情况的逻辑要求类型具有属性时,访问者模式组织代码来对类型的实例执行操作,而不改变目标类型的结构,就像为该模式记录的那样。
发布于 2017-01-09 09:55:33
“游客设计模式非常类似于构图工作的方式。”
其实并非如此。构图是抽象、封装、多态等对象生成的基本原则,它是一个简单的--关系。适配器、复合和装潢工模式是利用合成原理的完美范例。
访问者模式是从基本编程原则推导而来的高级解决方案。访客背后的基本逻辑是基于不同子类类型的方法重载。
例:您有一个基类或接口,名为和子类Crow、Duck和Penguin。您需要某个客户端类的方法来执行不同的w.r.t操作。子类的类型。这里假设,我想要一个Hunter类,其中区分了Hunter.hunt()方法w.r.t的行为。无论是乌鸦,鸭子还是企鹅。
所以我的亨特类是这样的。
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.
}
}如果我真的喜欢这个,
Bird bird = new Duck();
Hunter hunter = new Hunter();
hunter.hunt(bird);现在,这个hunter.hunt();将自动导航到hunt(Duck duck)方法并被执行。
我想你明白,组成原则和访客模式之间没有多大关系。
最后,访问者在一般中并不是一个好的模式。原因是,当添加不同的新子类时,它使您不断地重载越来越多的方法。在我们的示例中,如果您想添加新的类,如鸽子、鹰等,则必须添加方法hunt(Pigeon pigeon)和hunt(Eagle eagle)。这将是一个可怕的大规模维护问题,尤其是。所以,如果你只在没有其他选择或者没有反弹的情况下使用它,那就更好了。
发布于 2017-01-09 12:23:35
也许您应该考虑在什么地方使用所述的模式,以便理解其中的区别:
复合
将对象组合成树结构来表示对象的部分整体hierarchies.Group,其处理方式与对象的单个实例相同。
绘图示例(java中的swing库):绘图可以由图形原语(如线条、圆圈、矩形、文本等)组成(组合)。但是为了绘制,我们用处理原始对象的方式完全相同地操作组合。
访客
允许在运行时将一个或多个操作应用于一组对象,从而使操作与对象结构分离。
基本思想是拥有相同的机制,如何遍历对象结构(对象结构可以是树,看起来类似于组合),然后在每一步通过结构中的对象,我们可以有一个或多个操作,
在编译器中,AST是对象结构,访问者可以用来遍历AST并生成二进制代码,或者XML输出或.
希望这能帮上忙
https://stackoverflow.com/questions/41543074
复制相似问题