首页 > 其他分享 >设计模式学习(十五):策略模式

设计模式学习(十五):策略模式

时间:2022-11-12 13:13:34浏览次数:90  
标签:设计模式 策略 items 模式 Sorter length 十五 排序

设计模式学习(十五):策略模式

作者:Grey

原文地址:

博客园:设计模式学习(十五):策略模式

CSDN:设计模式学习(十五):策略模式

策略模式

策略模式是一种行为型模式,它定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。

以实例来说明

假设我们有一个猫类,这个类里面有体重和身高这两个属性,给你一个猫的集合,然后需要你按猫的体重从小到大排序

主要思路

我们可以把体重从小到大这个看成是一个策略,后续可能衍生其他的策略,比如: 按身高从高到低,体重从小到大,体重一样的身高从高到低……

以「身高从低到高」排序这个策略为例

public class CatSortStrategy implements Comparator<Cat> {
    @Override
    public int compare(Cat o1, Cat o2) {
        return o1.getHeight() - o2.getHeight();
    }
}

假设我们定义猫排序的方法是sort(), 那么这个方法必然需要传入一个排序策略的参数(否则我怎么知道要怎么排序猫?) 所以定义的 sort 方法可以是:

public class Sorter {
    public Cat[] sort(Cat[] items, Comparator<Cat> strategy) {
        int length = items.length;
        for (int i = 0; i < length; i++) {
            for (int j = i + 1; j < length; j++) {
                if (strategy.compare(items[i], items[j]) > 0) {
                    Cat tmp = items[i];
                    items[i] = items[j];
                    items[j] = tmp;
                }
            }
        }
        return items;
    }
}

进一步抽象,如果我想让 Sorter 这个工具类不仅可以对猫进行各种策略的排序(基于比较的排序算法),还可以对狗进行各种策略的排序(基于比较排序算法),可以将 Sorter 定义成泛型

public class Sorter<T> {
    public T[] sort(T[] items, Comparator<T> strategy) {
        int length = items.length;
        for (int i = 0; i < length; i++) {
            for (int j = i + 1; j < length; j++) {
                if (strategy.compare(items[i], items[j]) > 0) {
                    T tmp = items[i];
                    items[i] = items[j];
                    items[j] = tmp;
                }
            }
        }
        return items;
    }
}

调用的时候, 泛型版本的 Sorter 可以对猫和狗都进行基于特定排序策略的排序。

Sorter<Cat> sorter = new Sorter<>();
Cat[] sortedCats = sorter.sort(cats,new CatSortStrategy());
Sorter<Dog> sorter = new Sorter<>();
Dog[] sortedCats = sorter.sort(dogs,new DogSortStrategy());

上述示例的 UML 图如下

image

策略模式的应用

  • Spring 中的 Resource 接口。

UML 和 代码

UML 图

代码

更多

设计模式学习专栏

参考资料

标签:设计模式,策略,items,模式,Sorter,length,十五,排序
From: https://www.cnblogs.com/greyzeng/p/16883511.html

相关文章

  • 动态代理模式下UndeclaredThrowableException的产生
    API文档我们先来看下这个异常类的api文档:Thrownbyamethodinvocationonaproxyinstanceifitsinvocationhandler'sinvokemethodthrowsacheckedexception(a......
  • 设计模式-建造者模式
    在我们生活中的对象比如汽车,它是由车轮、车架、发动机等组合起来的对象,但是往往使用的人只想要一辆汽车并不想知道创建汽车的过程此时就可以使用建造者模式。在软件开发中,也......
  • 设计模式学习(十四):模板方法
    设计模式学习(十四):模板方法作者:Grey原文地址:博客园:设计模式学习(十四):模板方法CSDN:设计模式学习(十四):模板方法模板方法模板方法是一种行为型模式。假设我们要实现一个游......
  • 访问者模式
    访问者模式有点小复杂,而且需要在实际的时候提前留好后门,下面通过简单的例子来介绍一下。场景就是邮件发送,通知客户怎么了怎么了,后面可能需要短信或者app也推。推之前或推送......
  • 给网站添加一个夜间模式
    最近发现了一个可以很简单给网站添加夜间模式的js库项目地址:https://darkmodejs.learn.uno/将下面的代码放到网站的头部或尾部,就会在网页的右下角出现一个按钮,点击即可......
  • Redis 集群模式的安装与配置【源码安装redis-7.0.5】
    Redis最新版下载地址:http://download.redis.io/releases/redis-7.0.5.tar.gz步骤如下:1)wget http://download.redis.io/releases/redis-7.0.5.tar.gz2)tar-zxf redis-7......
  • Java静态代理设计模式模式(多线程Runnable)
    静态代理设计模式,就是代理对象来帮你忙前忙后,你负责出席一下就好了。需要:1.实现相同的接口2.真实角色3.代理角色,里面有一个成员是接口对象(实际上是真实角色----接口实......
  • 设计模式学习(十三):观察者模式
    设计模式学习(十三):观察者模式作者:Grey原文地址:博客园:设计模式学习(十三):观察者模式CSDN:设计模式学习(十三):观察者模式观察者模式观察者模式是一种行为型模式。在对象之间......
  • 【JS】891- 高级 Promise 模式 - Promise缓存
    https://www.jonmellman.com/posts/promise-memoization 译者:ConardLi在本文中,我们将介绍常见的缓存实现在并发条件下存在的问题。然后我们将介绍如何修复它,并且在此过程......
  • 命令模式
    命令模式使用场景我反复强调,设个非常重要!因为纵使你有十八般武器,不知道什么时候用也是白搭。从定义上我们就可以看出其可以解决的问题。当需要将各种执行的动作抽象出来......