策略模式和模板模式该怎么区分?

发布于 2022-09-01 15:50:37 字数 835 浏览 7 评论 0

看了这两个设计模式之后, 对于简单直接的例子可以判断, 策略模式就是定义算法族, 然后通过组合算法族和委托的办法来实现类, 模板方法则是父类定义算法的骨架,子类再来实现骨架中的部分步骤;

但是有两个例子我很不理解:
1. thingking in java里面有讲到File.list(FilenameFilter filter)FilenameFilter就是策略设计模式. 这是书中的原文:

因为list()实现了基本的功能, 而且按照FilenameFilter的形式提供了这个策略, 以便完善list()在提供服务时所需的算法

我觉着 list()在内部使用FilenameFilter, 也可以理解为File定义好了算法骨架, 由FilenameFilter补齐部分步骤, 这么想 这就是 模板方法; Arras.sort()

  1. head first设计模式 里面讲到Arrays.sort(Object[] objects)和``Comparable```是模板方法设计模式. 这是head first的原文:

因为这个模式的重点在于提供一个算法, 并让子类实现某些步骤而数组的排序做法明显也是如此.

我是这么想的: sort()函数提供了基本的功能, 元素的比较由comparable算法族来实现; 我这样想, sort()函数就是策略模式;

到底这两者该怎么区分呢? 还是我的理解哪里有问题?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

星軌x 2022-09-08 15:50:37
  • 策略(Strategy),对象行为型模式 =》使用组合的方式
  • 模板方法(Template method),类行为型模式 =》 使用继承的方式

Head First里面问答里面有说明

因为策略模式使用对象组合。在某种程度上,你是对的——我们使用数组对象排序我们的数组,这部分和策略模式非常相似。但是请记住,在策略模式中,你所组合的类实现了整个算法。数组所实现的排序算法并不完整,它需要一个类填补compareTo()方法的实现。因此,我们认为这更像模板方法。

Arrays类里面还有另外一个api:

public static <T> void sort(T[] a,
            Comparator<? super T> c)

将Comparator也当成一种算法看的话,感觉这个api更像策略模式。


白话一点,模板方法模式的对象只是实现了算法的某个步骤,具体的算法大部分定义在父类里。而策略模式的对象实现了整个算法。

沉默的熊 2022-09-08 15:50:37

设计模式只是抽象的结果。而抽象的主要作用就是增加代码的可读性,复用性和可扩展性。所以不用刻意去在乎到底使用的是模板还是策略。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文