【发布时间】:2021-06-04 22:59:33
【问题描述】:
我正在学习策略模式,它似乎是继承的一个了不起的替代方案。我一直在思考它的用例,但是当我尝试连接这些点时,我一直在努力解决这个问题:
当我的对象是异构的时,这是如何工作的。
那么,我的意思是什么?最简单的解释方法是用我听到的一个例子。有人试图通过告诉我“假设您有一个 List 并且该列表应该是可排序的。您可以实现接口 Sortable 并在那里添加逻辑,但更好的选择是使用组合而不是继承并将可排序行为传递给列表构造时,可以复用不同类型列表之间的排序逻辑,并且可以在运行时切换列表的排序策略”
很酷,所以这个解释有我在策略模式中看到的 3 个要点:
- 它有利于组合而不是继承,从而使代码更加灵活和可维护。
- 因为我们没有实现接口,所以我们遵循 DRY。如果两个不同的列表需要相同的排序逻辑,它们就不必在 @Override 方法中重复代码。由于组合,我们可以重复使用。
- 我们可以在运行时交换行为,这遵循打开/关闭原则。
困扰我的是,为了对列表进行排序,我们需要大量关于列表的信息。列表的类型很多,它们都有不同的内部结构。如果对象是异构的,那么很难有一种可以应用于两种不同类型列表的排序策略。
想象一下,我有一个 LinkedList、一个 ArrayList 和一个 DoublyLinkedList。为了对其中的每一个进行排序,我需要深入了解每个实现的实际状态、结构或内部结构(无论您想如何称呼它们)。因此,很难创建一个可以在所有这些列表上运行的策略。
- 在这些情况下,策略模式实际上是如何工作的?
- 或者它根本不适合用于异构对象?
- 是否应该仅在策略不需要了解对象的任何内部时才使用策略?
- 是否应该仅在所有对象都可以为策略提供相同信息才能工作时才使用它?
如果策略依赖于对象的内部结构,它就不能重用......那么,有没有任何现实生活中的例子可以阐明这种模式的实际价值?
我本身没有最后一个问题(我问了很多问题),但我认为我的观点和关注点很明确。
【问题讨论】:
-
这样的异构对象的例子会很方便。
-
@NikolasCharalambidis 添加了一些列表示例
-
感谢您的更新。
ArrayList和LinkedList都实现了相同的接口List(我不知道DoublyLinkedList是什么意思,因为它正是JDK 中的LinkedList)。排序行为使用通过List接口可用的方法。 -
@NikolasCharalambidis 嗯好的,所以列表会自己传递给策略。好的,我明白你的意思。但具体到那个例子,使用这些接口不是很无用吗?如果我正在使用接口,为什么不创建一个使用 List 接口对列表进行排序的实用程序类呢?每当我需要不同的排序行为时,只需创建一个新的实用程序排序类。这样我的列表类就不必依赖 SortStrategy 对象了。
-
@NikolasCharalambidis
DoublyLinkedList不是普通的LinkedList.. 至少在Java中,LinkedLists 单独 @ 987654330@s 在 Java 中。
标签: java design-patterns strategy-pattern