我正在学习策略模式,它似乎是继承的一个惊人的替代方案。我一直在考虑它的用例,但当我试图将这些点连接起来时,有一件事我一直在纠结:
当我的对象是异构的时,这是如何工作的。
那么,我这么说是什么意思?最简单的解释方式是用我听到的一个例子。有人试图解释这种模式,他告诉我:“假设您有一个列表,该列表应该是可排序的。您可以实现Sortable接口并在其中添加逻辑,但更好的替代方法是使用组合而不是继承,并在html" target="_blank">构建列表时将可排序行为传递给列表,这样您就可以在不同类型的列表之间重用排序逻辑,并且可以在运行时切换列表上的排序策略。”
很酷,所以这个解释有我在策略模式中看到的三个要点:
一直困扰我的是,为了排序一个列表,我们需要很多关于列表的信息。有很多很多类型的列表,它们都有不同的内部结构。如果对象是异构的,那么很难有一个排序策略可以应用于两种不同类型的列表。
我没有最后一个问题(我问了很多问题),但我认为我的观点和关注是明确的。
所用策略模式的最简单示例是简单的JSK方法collections#sort(List,Comparator)
,它实际上使用Comparator
作为影响排序行为的注入行为(暂时将排序算法本身放在一边)。该方法用于对声明为列表的任何内容进行排序,而不管其泛型类型如何,因为comparator
就是用它来处理的。因此,我想说它已经准备好对任何异类对象进行排序了。
如果你觉得方法不够充分,可以随意扩大策略的责任范围。这里有一个例子:
<T extends List<E>, E> T sortList(T list, SortingStrategy<T, E> strategy) {
return strategy.sortList(list);
}
interface SortingStrategy<T extends List<E>, E> {
T sortList(T list);
}
现在战略的实施。我使用JDK集合,但您并不局限于这个层次结构,因为您可以定义自己的层次结构。
class ArrayListSortingStrategy<E> implements SortingStrategy<ArrayList<E>, E> {
@Override
public ArrayList<E> sortList(final ArrayList<E> list) {
return /* ... implementation ... */;
}
}
class LinkedListSortingStrategy<E> implements SortingStrategy<LinkedList<E>, E> {
@Override
public LinkedList<E> sortList(final LinkedList<E> list) {
return /* ... implementation ... */;
}
}
List<String> arrayList = sortList(new ArrayList<>(), new ArrayListSortingStrategy<>());
Deque<String> linkedList = sortList(new LinkedList<>(), new LinkedListSortingStrategy<>());
public ArrayListSortingStrategy(Comparator<E> comparator) { /* ... */ }
主要内容:介绍,实现,Strategy.java,OperationAdd.java,OperationSubtract.java,OperationMultiply.java,Context.java,StrategyPatternDemo.java在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 contex
策略模式 亦称: Strategy 意图 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 问题 一天, 你打算为游客们创建一款导游程序。 该程序的核心功能是提供美观的地图, 以帮助用户在任何城市中快速定位。 用户期待的程序新功能是自动路线规划: 他们希望输入地址后就能在地图上看到前往目的地的最快路线。 程序的首个版本只能规划公
把不变的部分和变化的部分隔开是每个设计模式的主题。 条条大路通罗马。我们经常会遇到解决一件事情有多种方案,比如压缩文件,我们可以使用zip算法、也可以使用gzip算法。其灵活多样,我们可以采用策略模式解决。 一、定义 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 基于策略类模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if...
问题 解决问题的方式有多种,但是你需要在程序运行时选择(或是转换)这些方法。 解决方案 在策略对象(Strategy objects)中封装你的算法。 例如,给定一个未排序的列表,我们可以在不同情况下改变排序算法。 基类 StringSorter = (algorithm) -> sort: (list) -> algorithm list 策略 bubbleSort = (list) -
应用场景 一个商场收银软件,营业员根据客户所购买的商品的单价和数量,向客户收费 用两个文本框来输入单价和数量,一个确定按钮来算出每种商品的费用,用个列表框来记录商品的清单,一个标签来记录总计,一个重置按钮来重新开始。 double total = 0.0d; private void btn0k_Click(object sender, EventArgs e) { double