设计模式之策略模式

简单工厂模式和策略模式实现简单排序算法。 NULL 博文链接:https://xiaqi-2009.iteye.com/blog/1041277 立即下载

一、一个数值的排序问题引伸出JDK的Comparable接口

一个数组由整型元素组成,要求从小到达进行排序,排序类如下:

public class DataSorter {

	public static void sort(int[] arr) {
		for(int i = arr.length; i > 0; i--) {
			for(int j = 0; j < i - 1; j++) {
				if(arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
	}

	public static void print(int[] arr) {
		for(int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}

}

客户端调用如下:

public class Client {

	public static void main(String[] args) {
		int[] arr = new int[]{4, 2, 1, 6, 5, 3};
		DataSorter.sort(arr);
		DataSorter.print(arr);
	}

}

此排序类能正常的完成所需要的功能,但是只能对整型数组进行排序,如果需要对浮点型数组进行排序,就需要把sort和print方法都进行重载,如果是对自定义对象数组进行排序,也需要重载,且还需要设定排序策略,到底是依据什么来判断对象谁大谁小呢?为此,定义一个叫做Comparable的接口,如下:

public interface Comparable<T> {

	public int compareTo(T t);
}

再新建一个自定义类Dog,此类要求实现Comparable接口,并定义自己的排序策略,如下:

public class Dog implements Comparable<Dog> {  
      
    private double height;  
    private double weight;  
      
    public Dog(double height, double weight) {  
        this.height = height;  
        this.weight = weight;  
    }  
      
    public double getHeight() {  
        return height;  
    }  
    public void setHeight(double height) {  
        this.height = height;  
    }  
    public double getWeight() {  
        return weight;  
    }  
    public void setWeight(double weight) {  
        this.weight = weight;  
    }  
  
    @Override  
    public int compareTo(Dog dog) {  
        if(this == dog) {  
            return 0;  
        } else {  
            if(this.getHeight() > dog.getHeight()) {  
                return -1;  
            } else if(this.getHeight() < dog.getHeight()) {  
                return 1;  
            } else {  
                return 0;  
            }  
        }  
    }  
  
    @Override  
    public String toString() {  
        return "[height=" + height + ", weight=" + weight + "]";  
    }  
  
}  

再定义新的排序类DataSorter02,实现对任何类型的数组进行排序,只要数组元素实现了Comparable接口,如下:

public class DataSorter02 {  
  
    public static void sort(Comparable[] obj) {  
        for(int i = obj.length; i > 0; i--) {  
            for(int j = 0; j < i - 1; j++) {   
                if(obj[j].compareTo(obj[j + 1]) == -1) {  
                    Comparable temp = obj[j];  
                    obj[j] = obj[j + 1]; 
                    obj[j + 1] = temp;  
                }  
            }  
        }  
    }  
  
    public static void print(Comparable[] obj) {  
        for(int i = 0; i < obj.length; i++) {  
            System.out.print(obj[i] + " ");  
        }  
        System.out.println();  
    }  
  
}

客户端对Dog类型数组进行排序,如下:

public class Client02 {  
  
    public static void main(String[] args) {  
        Dog[] dogs = new Dog[] {new Dog(5.0, 1.0), new Dog(4.0, 2.0), new Dog(6.0, 3.0)};  
        DataSorter02.sort(dogs);  
        DataSorter02.print(dogs);  
    }  
  
}

排序后输出为:[height=4.0, weight=2.0] [height=5.0, weight=1.0] [height=6.0, weight=3.0],可见实现了排序的功能,且只要是排序的对象实现了Comparable接口并实现了compareTo方法,那么DataSorter02这个排序类就能对任意类型的数组进行排序,不用在根据要排序的对象的类型不同而重载sort和print方法,这里的Comparable接口其实就是模拟的JDK提供的Comparable接口,但是到目前为止,还不是策略模式,这里虽然对实现排序的功能统一了接口,但是排序的策略却是固定的,比如在Dog类中是按照height属性的大小进行排序的,排序的策略是写死了的,以后如果要按照其他的排序策略来进行排序又得修改程序,不具备扩展性和灵活性,所以,下面要说的就是策略模式。

二、策略模式(引伸出JDK Comparator接口)

比如要对之前的Dog类按照weight属性大小进行排序,又该怎么办呢?定义一个名叫Comparator的接口,如下:

public interface Comparator<T> {  
  
    public int compare(T t1, T t2);  
}

定义一个排序的策略类,并实现Comparator接口,对Dog类按照weight属性大小进行排序,如下:

public class DogWeightComparator implements Comparator<Dog> {  
  
    @Override  
    public int compare(Dog d1, Dog d2) {  
        if(d1 == d2) {  
            return 0;  
        } else {  
           if(d1.getWeight() > d2.getWeight()) {  
                return -1;  
           } else if(d1.getWeight() < d2.getWeight()) {  
               return 1;  
           } else {  
                return 0;  
           }  
        }  
    }  
  
}

然后,修改Dog类,指定一个排序的策略类,就是上面的按照weight属性进行排序的策略类,如下:

public class Dog implements Comparable<Dog> {  
      
    private double height;  
    private double weight;  
    private Comparator<Dog> dogWeightComparator;  
      
    public Dog(double height, double weight, Comparator<Dog> dogWeightComparator) {  
        this.height = height;  
        this.weight = weight;  
       //指定排序采用的策略  
        this.dogWeightComparator = dogWeightComparator;   
    }  
      
    public double getHeight() {  
        return height;  
    }  
    public void setHeight(double height) {  
        this.height = height;  
    }  
    public double getWeight() {  
        return weight;  
    }  
    public void setWeight(double weight) {  
        this.weight = weight;  
    }  
  
    @Override  
    public int compareTo(Dog dog) {  
        //依据指定的排序策略进行排序  
        return this.dogWeightComparator.compare(this, dog);  
    }  
  
    @Override  
    public String toString() {  
        return "[height=" + height + ", weight=" + weight + "]";  
    }  
  
}

接着排序类不变,依然使用之前的DataSorter02进行排序操作,客户端调用如下:

public class Client03 {  
  
    public static void main(String[] args) {  
        Comparator<Dog> comparator = new DogWeightComparator();  
        //传入排序的策略  
        Dog[] dogs = new Dog[] {new Dog(5.0, 12.0, comparator), new Dog(4.0, 2.0, comparator), new Dog(6.0, 3.0, comparator)};  
        DataSorter02.sort(dogs);  
        DataSorter02.print(dogs);  
    }  
  
}

最后输出为:[height=4.0, weight=2.0] [height=6.0, weight=3.0] [height=5.0, weight=12.0],可发现实现了按照weight属性大小进行排序,以后还可以按照其它某种方式进行排序,只要排序的策略类实现了Comparator接口,将其传入即可实现排序,需要修改的仅仅只是添加新的排序策略类,实现了代码的可扩展性和灵活性。这里的Comparator接口也是模拟JDK提供的Comparator接口。

三、总结

1、策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

2、策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

3、策略模式的Comparator接口层次定义了一系列的可供重用的算法或行为,实现有助于析取出这些算法中的公共功能。

4、策略模式还可以简化单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

 

 

 

 

 

稳定性性能系列之十五——系统稳定性监控体系建设:从指标到预警的完整方案 深入探讨Android系统稳定性监控体系的设计与实现,涵盖指标体系设计、数据采集方案、异常检测算法、预警响应机制,并提供完整的监控平台搭建实践。 阅读详情

相关推荐

解决鸿蒙/荣耀设备GMS应用调试中的“Play保护机制认证”报错

本文详细解析了在鸿蒙或荣耀设备上调试GMS应用时,遇到“Play保护机制认证”报错的根本原因与解决方案。核心在于获取设备的GMS Device ID,并通过Google官方渠道完成临时注册,从而绕过认证限制。文章提供了无需Root和ADB查询两种具体方法,并分享了授权后的故障排查与实战经验,帮助开发者高效解决问题。

weixin_29288313的博客 298

策略模式经典案例【排序算法】

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法都封装起来,并且使它们可以相互替换。策略模式可以让算法的变化独立于使用它们的客户端,从而提高了系统的灵活性和可维护性。

『愚』的博客 1234

8155平台multi-display(多屏显示)原理与配置

8155平台多屏互动原理与配置

漂流瓶の海岸 1606

JAVA--基于策略模式几种排序算法的实现

进来学习了设计模式,这里使用策略模式来组织多种排序算法。 首先我们定义一个抽象类,OrderBase,数据的输入,展示部分在抽象类里实现,具体的排序逻辑在各个子类里实现。     为什么用抽象类不用接口?接口里只有函数的定义,不能有实现。使用抽象类,可以实现公共函数,定义抽象函数。(父类和子类就是一个从一般到特殊的过程) OrderBase.java public abstract ...

qq_20694641的博客 1932

【深圳】IBM V3500存储维修 更换控制器故障

今天给大家分享的是深圳.福田区一个电商客户公司一台IBM Storwize v3500存储控制器故障从远程诊断 收集日志 分析结果的实际案例,如图所示通过存储管理口登陆进去后直接看到少了一个控制器,经过工程师分析日志后判定为该控制器损坏,接下来更换控制器配件,标准套件的控制器不带子卡和电池,所以需要把故障控制器上的子卡和电池拆下来装到新控制器上,这个电池拆还需要点技巧,接着把新的控制器插回V3500主机,等待大约十分钟后,新控制器指示灯全绿,管理界面看到节点已联机;冠峰科技-爱科技爱分享。

OuYangYuXi的博客 4576

手把手教你用树莓派蓝牙抓取小米温湿度计2代数据,接入HomeAssistant(附密钥获取避坑指南)

本文详细介绍了如何通过树莓派蓝牙抓取小米温湿度计2代数据并接入HomeAssistant的完整流程。重点解析了获取32位加密密钥的三种方法,包括使用Telink Flasher工具、米家APP抓包和开源工具ATC_MiThermometer,并提供了HomeAssistant集成配置和常见问题排查指南,帮助用户实现稳定可靠的温湿度监测。

一名菜鸟攻城师 779

策略模式之排序算法

策略模式(Strategy) 它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

cdporter的博客 1327

学习笔记:物理信息神经网络(PINN)

PINN 的强大在于它打破了传统数值方法的限制,将神经网络的非线性拟合能力与物理方程的严谨性结合起来。它在处理高维、数据稀缺、复杂物理约束的场景下尤其出色。当然,PINN 也有收敛慢、梯度消失等挑战,比如,复杂 PDE 可能导致梯度传播困难,收敛慢(梯度消失)、于具有快速变化特征的系统,如冲击波,标准 PINN 可能精度不足,需要改进策略,比如自适应采样或多尺度特征提取。但随着研究深入,这些问题正在不断被解决。物理或化学方程为什么往往是偏微分方程?什么是物理信息神经网络(PINN)?x_%7Bi%7D。

qq_52635735的博客 1万+

23种设计模式(12):策略模式

定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换。在前面说过的行为类模式中,有一种模式也是关注对算法的封装——模版方法模式,对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在于:...

java开发指南博客 【转载】 904

【数据集】3D-GloBFP:全球首个三维建筑轮廓数据集

【数据集】3D-GloBFP:全球首个三维建筑轮廓数据集

WW、forever的博客 1681

超详细!Linux 服务器 6 大核心性能测试(附自动脚本 + 结果分析秘籍)---Linux 服务器性能测试文档

本文档旨在提供 Linux 服务器的 CPU、内存和磁盘性能测试方案,包括详细的测试大纲、操作步骤以及一键化测试脚本,帮助管理员快速评估服务器性能状况。通过以上测试方案,可以全面评估 Linux 服务器的 CPU、内存和磁盘性能,为系统优化、容量规划和问题排查提供重要参考依据。使用 sysbench 进行 CPU 基准测试。使用 sysbench 测试内存读写性能。使用 fio 工具进行更全面的磁盘测试。使用 dd 命令测试磁盘顺序读写性能。使用 dd 命令测试内存读写速度。记录磁盘 IO 性能。

jundao1997的专栏 380

设计模式之策略模式(Strategy Design Pattern)

模板模式,是11种行为型模式之一。在 GoF 的《设计模式》一书中,它是这样定义的:Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.翻译成中文就是:定义一系列算法(策略),封装每一个算法(策略),并使它们可以互换。使算法(策略)可以独立于使用它的客

xjj1314的专栏 428

【YOLO11改进 - 特征融合】利用Hyper-YOLO 的混合聚合网络(MANet)改进yolo11,提升基础网络的特征提取能力

【YOLO11改进 - 特征融合】利用Hyper-YOLO 的混合聚合网络(MANet)改进yolo11,提升基础网络的特征提取能力

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 904

23种设计模式之策略模式(Strategy Pattern)

本篇文章将23种设计模式中的策略模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

设计模式-策略模式-Strategy Pattern

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互换使用,算法的变化不会影响使用算法的用户。策略模式的优点包括算法的封装和切换的灵活性,以及算法可独立于使用它的客户端变化。:如果算法的实现非常复杂,或者算法可能会随着时间而变化,策略模式可以帮助管理这种复杂性,使得算法的变化不会影响到使用算法的代码。:在需要根据不同条件动态切换算法的场景中,策略模式可以提供灵活的算法切换机制,例如,根据输入数据的特性选择不同的算法。

wesigj的博客 1456

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

设计模式-策略模式(Strategy Pattern)

设计模式-策略模式(Strategy Pattern)

weixin_45226668的博客 1506

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++设计模式——策略模式(Strategy Pattern)

C++设计模式——策略模式(Strategy Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——策略模式(Strategy Pattern)目录定义实现示例传统的策略模式实现使用函数指针实现策略模式工厂模式和策略模式对比总结参考资料 定义 Define a family of algorithms,encapsulate each one,and make them interchangeable. 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换 策略模式是指定

leonardohaig的博客 4772

设计模式:策略模式(Strategy Pattern)

策略模式是一种行为型设计模式,它定义了一系列算法,把它们一个个封装起来,并且使它们可以相互替换。这样,算法的变化不会影响到使用算法的客户。

TechNomad的博客 1262

设计模式之策略模式(DesignPattern of Strategy)

C++版设计模式之策略模式

一路Coding 593

23种设计模式-19策略模式(Strategy Pattern)

策略模式是在开发中最常见的设计模式之一,本文介绍了策略的基本原理及使用场景,以及基于 java 代码的普通实现和基于Spring 的实现案例。

不开心就吃辣 1872

设计模式之策略模式(Strategy Pattern)

设计模式中有六大原则和二十三设计模式。 其中六大原则分别为:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则。 二十三设计模式:单例模式、Builder 模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察者模式、备忘录模式、迭代器模式、模版方法模式、访问者模式、中介模式、代理模式、组合模式、适配器模式、装饰模式、享元模式、外观模式、桥接模式。

Mr_Four 608

设计模式教程:策略模式(Strategy Pattern)

定义一系列算法,将每个算法封装起来,并让它们可以互换,使得算法的变化独立于使用算法的客户。

遇见伯灵说的博客 978

Java设计模式--策略模式【Strategy Pattern】

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。    策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封

CoderLover 541

【设计模式】策略模式(Strategy Pattern)详解

策略模式(Strategy Pattern)是一种行为型设计模式,

qq_59344127的博客 1839

每天一个设计模式之策略模式(Strategy Pattern)

策略模式的适用场景是,当一个系统中只有算法策略变化,而其他都不变,这时候应当将算法隔离开,策略模式就是解决这类问题的模式。

Dive Deep into The Knowledge 469

23种设计模式——策略模式 (Strategy Pattern)​详解

本文介绍了23种经典设计模式之——策略模式 (Strategy Pattern)​的说明及使用

Meteors.的博客 837
上一篇: 《大话数据结构》笔记之 第七章 图
下一篇: 设计模式之责任链模式
漂流在深圳
博客等级 码龄15年 30粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值