我不得不解决一个特定的问题,在得到两个回复后,我意识到两个模式可以帮助解决这个问题(以及任何其他类似的问题)。
- 责任链模式
- 策略模式
我的问题是:
这些模式之间究竟有什么区别?
我的问题是:
这些模式之间究竟有什么区别?
它们非常不同。
策略模式是关于具有通用接口,您可以使用该接口来提供算法的不同实现,或者几个具有某些共同依赖性的算法或逻辑片段。
例如,您的CollectionSorter
可以支持一个SortingStrategy
(归并排序,快速排序,冒泡排序)。它们都具有相同的接口和目的,但可以执行不同的操作。
在某些情况下,您可能决定在内部确定策略。也许排序器基于集合大小等启发式方法。大多数时候确实是从外部注入的。这时模式真正发挥作用:它为用户提供了覆盖(或提供)行为的能力。
此模式是现在无处不在的控制反转的基础。完成经典模式后,学习下一步。
责任链模式涉及拥有一系列对象,这些对象通常从更详细到更通用。链中的每个部分都可以提供答案,但它们具有不同的详细级别。
GOF的流行示例是上下文帮助系统。当您单击桌面应用程序中的组件时,会显示哪个帮助?链中的第一项可以查找您单击的组件的帮助。链中的下一个可以尝试为整个包含对话框显示帮助。应用程序模块的下一个...等等。
看起来您还没有阅读GOF的“设计模式”经典著作,但是应该去阅读。
策略模式:
请查看此SE问题以获取策略示例:
责任链模式:
责任链模式是一种设计模式,由命令对象的源和一系列处理对象组成。每个处理对象包含定义它可以处理的命令对象类型的逻辑;其余的命令对象将传递给链中的下一个处理对象。
关键点:
现实世界的例子:在公司中,指定角色有特定的限制来处理采购请求。如果担任指定角色的人没有足够的权限来批准采购账单,他将把命令/请求转发给他的继任者,后者具有更多的权限。这个链条将继续,直到命令被处理。
请参考下面有用的SE问题/链接
策略模式是一种业务级别的设计模式,是如何实现给定目标/数据结果的标准化接口方式。
责任链模式更多地是一种实现模式 - 描述如何处理数据,而不是关注策略的目标。
例如:
假设我们有一个俱乐部有100名年轻游泳者,每年要选出10人团队参加常规国家比赛。比赛的形式不同 - 有些比赛有更多的仰泳比赛,有些则有更多的接力比赛,等等......这意味着您必须应用不同的团队选择策略。
因此,您有四种专用策略,每种针对不同的比赛项目。
在代码中,它可以看起来像:
RankingsSet rankedClubSet = getSwimmersRankings(SwimmersSet allSwimmers)
SwimmersSet teamOf10 = selectTeamForCompetion(RankingsSet rankedClubSet, CompetionSelectionStrategy strategy)
但如何获得排名?
你只需询问教练组的意见:
游泳者(自我评估) -> 生理学家 -> 生物更新训练师 -> 医生 -> 游泳教练 -> 队友 -> 教师 -> 父母... ----> 策略/资格委员会
这是一项责任链。顺序很重要...医生在未经生理学家评估之前无法评估游泳者,如果主教练拒绝游泳者,则父母的意见并不重要...
排名信息在从一个处理器传递到下一个处理器时合并,某些处理器的数据被隐藏,其他处理器可以用附加注释进行装饰...
有趣的是,在这种情况下,作为俱乐部的叙述者,您可以考虑两个层面的战略:
但在“设计模式”术语中,策略模式只有1种。
第2点太大了,无法通过单个设计模式进行分析。
重要的是要记住,在设计模式分析中,您应该专注于相当小的功能块,以便您可以轻松地识别单个模式并实现它。
当功能块太大时,自动涉及许多模式和它们之间的关系,讨论变得混乱,有些人对某些模式如此固执,以至于他们无处不见。识别设计模式基于缓慢的分析和仔细的问题分解。
CollectionSorter
选择使用哪种策略是否有效,或者根据某些标准在其他地方以编程方式执行,而不是用户执行此操作?因为我看到的所有关于策略模式的示例中,用户总是使用特定的策略调用调用。 - Oscar Mederos