Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.
Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from the clients that use it.
# 1 楼答案
Visitor适用于当你有一个类家族,你需要为该家族中的每个类添加新功能,但不涉及类本身(或希望在一个地方定义新功能——Visitor)时
策略适用于当您有一系列类需要能够执行某些操作才能正常工作(例如对它们包含的某些对象进行排序)但您希望客户机或依赖注入告诉他们如何执行该操作时
# 2 楼答案
访客模式意图:
如果:
尽管访问者模式提供了在不更改对象中现有代码的情况下添加新操作的灵活性,但这种灵活性也有一个缺点
如果添加了新的可访问对象,则需要在Visitor&;参观课程。解决这个问题有一个变通方法:使用反射,这将对性能产生影响
有关更多详细信息,请参阅oodesign article和sourcemaking文章
战略模式意图:
策略可以让你改变一个物体的内脏
有关更多详细信息,请参阅以下问题:
Real World Example of the Strategy Pattern
# 3 楼答案
主要区别在于策略模式封装了一组相关行为,而访客模式封装了多个这样的组
# 4 楼答案
想象一下,你正在构建一个收银机应用程序,该应用程序正在生成收据。假设你想:
1.确保不同种类的物品(书籍、水果、肉类、化妆品等)的处理方式不同
2.将价格的实际计算逻辑与项目定义分开
3.确保如果商店开始销售全新的东西(比如按长度收费的布料),你不需要更改太多代码
Visitor可以是一个类,它根据正在处理的项目类型定义不同类型的计算。这是一项将价格计算中的差异从商品层次结构中移除的服务
其中
getPrice
的主体可以如下所示:在说
ShoppingCart
时,你将做:想象一下这样的场景:在黑色星期五,你想做一些疯狂的折扣,所有书籍七折,所有水果五折。你可以很容易地做一些事情:
策略相反,可以有一个不同类型计算(策略)的层次结构,然后每个项目将定义应该使用哪个计算(策略)(“插入”)
现在有很多方法来定义哪个项目应该使用哪个计算。最简单的方法是给出
Item
方法getCalculator
,让每个项目选择它需要的计算这可能没有那么动态——从某种意义上说,每个项目都需要一个预定义的计算器来使用。但是想想这个场景:店主决定菠萝和西瓜应该每件出售——我们可以很容易地让
Fruit
默认使用WeightCalculator
,并创建一个子集水果,按数量出售# 5 楼答案
除了上面提到的行为差异之外,我在一个项目中也经历了依赖关系和用例方面的差异,如下所示
例如,访问者了解具体的类。因此,在向层次结构中添加新的具体类时,您可以更灵活地更改访问者代码。战略中没有这样的东西。在这种情况下,如果有方法只返回带有给定输入的一些输出,而不考虑上下文,那么策略就更合适了
此外,访客模式还用于实现SOLID的SRP,以分离关注点
# 6 楼答案
Visitor模式用于遍历对象层次结构,并提供一些功能,如打印或报告等。我使用它提供了不同的格式(文本/HTML),通过编写多个访问者来打印对象层次结构,每种格式一个访问者。层次结构中的对象是visitables
策略模式用于根据输入选择特定的逻辑路径。一个典型的例子是身份验证过滤器,根据
Authorization
HTTP头中的值,选择并运行不同的身份验证策略,如NTLM/congotiate/Basic。过滤器将保存对AuthenticationStrategy接口的引用,根据传入的请求,选择特定的身份验证策略并将其分配给该引用,随后的代码不需要知道所使用的确切策略