当前位置: 首页 > 知识库问答 >
问题:

异构对象的策略模式

曹浩
2023-03-14

我正在学习策略模式,它似乎是继承的一个惊人的替代方案。我一直在考虑它的用例,但当我试图将这些点连接起来时,有一件事我一直在纠结:

当我的对象是异构的时,这是如何工作的。

那么,我这么说是什么意思?最简单的解释方式是用我听到的一个例子。有人试图解释这种模式,他告诉我:“假设您有一个列表,该列表应该是可排序的。您可以实现Sortable接口并在其中添加逻辑,但更好的替代方法是使用组合而不是继承,并在html" target="_blank">构建列表时将可排序行为传递给列表,这样您就可以在不同类型的列表之间重用排序逻辑,并且可以在运行时切换列表上的排序策略。”

很酷,所以这个解释有我在策略模式中看到的三个要点:

  1. 它更喜欢组合而不是继承,使代码更加灵活和易维护。
  2. 因为我们没有实现接口,所以我们遵循DRY。如果两个不同的列表需要相同的排序逻辑,那么它们就不必在其@override方法中重复代码。由于组合,我们可以重用。
  3. 我们可以在运行时交换行为,它遵循打开/关闭原则。

一直困扰我的是,为了排序一个列表,我们需要很多关于列表的信息。有很多很多类型的列表,它们都有不同的内部结构。如果对象是异构的,那么很难有一个排序策略可以应用于两种不同类型的列表。

    null

我没有最后一个问题(我问了很多问题),但我认为我的观点和关注是明确的。

共有1个答案

储阳曦
2023-03-14

所用策略模式的最简单示例是简单的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 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

  • 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if...

  • 策略模式 策略模式就是用统一的方法接口分别对不同类型的数据进行访问。比如说,现在我们想用pc看一部电影,此时应该怎么做呢?看电影嘛,当然需要各种播放电影的方法。rmvb要rmvb格式的方法,avi要avi的方法,mpeg要mpeg的方法。可是事实上,我们完全可以不去管是什么文件格式。因为播放器对所有的操作进行了抽象,不同的文件会自动调用相应的访问方法。 typedef struct _MovieP