策略、访问者和模板方法模式之间有什么区别?
我在课堂上刚刚学习了这些设计模式。但是我看不出它们之间有什么区别。它们听起来是一样的,都是在抽象类之上创建具体类。有人可以帮我打消这个疑虑吗?谢谢 (:
I'm in a class where we just learned about these design patterns. However I couldn't see any difference between them. They sound just like the same, creating concrete classes over the abstract one. Could somebody help me kill this doubt? thanks (:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
访问者、策略和模板模式都包含算法的应用。最大的区别在于它们是如何被唤起以及如何在实践中使用的。虽然它们看起来具有相同的用例,但查看对象的构造即可发现差异。
当我们没有能力将函数作为第一类对象传递时,通常会使用策略模式。它需要一个非常具体的参数列表,并且仅在其调用模式中包含该参数列表。例如:
然后将其应用于类型“Foo”的对象列表。我们确实没有其他方法可以将其应用到任何其他对象。
另一方面,当我们想要将算法应用于一组可能不共享相同签名或不具有相同成员函数的对象时,将使用访问者模式。我们说访问者模式是因为它经常在遍历树或另一个“不相关”对象的集合(在继承意义上不相关)时使用。
这里的想法是我们希望“向上”所有这些对象。它们并不共享相同的成员函数签名,但在概念上都是相关的。因此,我们可以“访问”这些类中的每一个,但期望算法执行相同类型的任务。
通过使用访问者模式,我们避免了将每个类包装在代理模式中的需要。因此,对于 N 个类,我们希望应用此算法,而无需创建 N 个代理类。我们只需要在一个访问者类中添加N个方法。
模板方法与访问者模式和策略模式有很大不同。使用模板,您要做的就是在层次结构中的不同子类上强制执行相同类型的算法。例如:
所以算法的结果在层次结构内是不同的。
Both the visitor, the strategy, and the template pattern encompass the application of an algorithm. The biggest difference is in how they are evoked and how they are used in practice. While it may seem like they have the same use case, look at the construction of the objects to see the difference.
The strategy pattern is often used when we don't have the ability to pass around functions as a first class object. It expects a very specific argument list and only that argument list in its call pattern. For instance:
which is then applied to a list of objects of type "Foo." We really have no other way of applying it to any other object.
The visitor pattern on the other hand is used when we want to apply an algorithm to a bunch of objects that might not share the same signature nor have the same member functions. We say visitor pattern because it's often used when traversing a tree or another collection of "unrelated" objects (unrelated in an inheritance sense.)
Here, the idea is that we'd like to "up" all these objects. They all don't share the same member function signature but all are conceptually related. Hence, we can "visit" each of these classes but expect the algorithm to perform the same type of task.
By using a visitor pattern we avoid the need to wrap each class in a proxy pattern. Hence, for N classes we'd like to apply this algorithm to we don't need to make N proxy classes. We only need to add N methods to a visitor class.
The template method is quite different from either the visitor and the strategy pattern. With the template what you're trying to do is enforce the same type of algorithm but on different subclasses within a hierarchy. For instance:
So the result of the algorithm varies within the heirarchy.
共性:
区别:
看看模板方法,策略 和 访客 和 Sourcemaking 文章以便更好地理解。
相关文章:
我什么时候应该使用访问者设计模式?
策略模式的真实示例
JDK中的模板设计模式,找不到定义要按顺序执行的方法集的方法
Commonalities:
Differences:
Have a look at Template method , Strategy and Visitor and Sourcemaking articles for better understanding.
Related posts:
When should I use the Visitor Design Pattern?
Real World Example of the Strategy Pattern
Template design pattern in JDK, could not find a method defining set of methods to be executed in order