【设计模式-02】Strategy策略模式及应用场景

一、参考资料

  • Java 官方文档

Overview (Java SE 18 & JDK 18)module indexicon-default.png?t=N7T8https://docs.oracle.com/en/java/javase/18/docs/api/index.html

  • Java中使用到的策略模式

Comparator、comparable

Comparator (Java SE 18 & JDK 18)declaration: module: java.base, package: java.util, interface: Comparatoricon-default.png?t=N7T8https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Comparator.html

Comparable (Java SE 18 & JDK 18)declaration: module: java.base, package: java.lang, interface: Comparableicon-default.png?t=N7T8https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/lang/Comparable.html

二、主要设计思想

对更改关闭,对扩展开放,程序更有弹性,可扩展性强。

Extensibility、Scalability

三、应用场景

对任意数据类型的数组进行排序,如对int、double、float以及对象的排序。

1、Cat.java 对象

/*** @description: 猫对象* @author: flygo* @time: 2022/7/4 11:11*/
public class Cat {private int height, weight;public Cat() {}public Cat(int weight, int height) {this.weight = weight;this.height = height;}public int compareTo(Cat c) {if (this.weight < c.weight) return -1;else if (this.weight > c.weight) return 1;else return 0;}@Overridepublic String toString() {return "Cat{" + "height=" + height + ", weight=" + weight + '}';}
}

2、Sorter.java 排序类

/*** @description: 排序对象* @author: flygo* @time: 2022/7/4 11:16*/
public class Sorter {public void sort(Cat[] arr) {for (int i = 0; i < arr.length - 1; i++) {int minPos = i;for (int j = i + 1; j < arr.length; j++) {minPos = arr[j].compareTo(arr[minPos]) == -1 ? j : minPos;}swap(arr, i, minPos);}}static void swap(Cat[] arr, int i, int j) {Cat temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}

3、StrategyMain 主类

import java.util.Arrays;/*** @description: 主方法* @author: flygo* @time: 2022/7/4 11:15*/
public class StrategyMain {public static void main(String[] args) {//    int[] arr = {2, 4, 3, 6, 10, 1};Cat[] arr = {new Cat(3, 3), new Cat(5, 5), new Cat(1, 1)};Sorter sorter = new Sorter();sorter.sort(arr);System.out.println(Arrays.toString(arr));}
}

四、使用泛型调整修改

1、定义Comparable接口

注意接口中使用了泛型 <T>,定义了compareTo接口方法。

/*** @description: 比较接口类* @author: flygo* @time: 2022/7/4 15:46*/
public interface Comparable<T> {int compareTo(T o);
}

2、Sorter 排序类

使用Comparable 接口类承接对象数组,只要实现了Comparable接口中compareTo方法,都可以进行排序。

/*** @description: 排序对象* @author: flygo* @time: 2022/7/4 11:16*/
public class Sorter {public void sort(Comparable[] arr) {for (int i = 0; i < arr.length - 1; i++) {int minPos = i;for (int j = i + 1; j < arr.length; j++) {minPos = arr[j].compareTo(arr[minPos]) == -1 ? j : minPos;}swap(arr, i, minPos);}}static void swap(Comparable[] arr, int i, int j) {Comparable temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}

3、定义一个需要排序的对象,如Dog

Dog对象实现 Comparable 接口类中的 compareTo 方法

/*** @description: 狗* @author: flygo* @time: 2022/7/4 15:48*/
public class Dog implements Comparable<Dog> {int food;public Dog(int food) {this.food = food;}@Overridepublic int compareTo(Dog o) {if (this.food < o.food) return -1;else if (this.food > o.food) return 1;else return 0;}@Overridepublic String toString() {return "Dog{" + "food=" + food + '}';}
}

4、最终效果

最终可以实现对实现Comparable 接口compareTo方法的任意对象进行排序

import java.util.Arrays;/*** @description: 主方法* @author: flygo* @time: 2022/7/4 11:15*/
public class StrategyMain {public static void main(String[] args) {//    int[] arr = {2, 4, 3, 6, 10, 1};//    Cat[] arr = {new Cat(3, 3), new Cat(5, 5), new Cat(1, 1)};Dog[] arr = {new Dog(5), new Dog(1), new Dog(3)};Sorter sorter = new Sorter();sorter.sort(arr);System.out.println(Arrays.toString(arr));}
}

五、源码地址

GitHub - jxaufang168/Design-Patterns: 设计模式学习设计模式学习. Contribute to jxaufang168/Design-Patterns development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/jxaufang168/Design-Patterns



 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/613025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算数学表达式的程序(Java课程设计)

1. 课设团队介绍 团队名称 团队成 员介绍 任务分配 团队成员博客 XQ Warriors 徐维辉 负责计算器数据的算法操作&#xff0c;如平方数、加减乘除&#xff0c;显示历史计算记录 无 邱良厦&#xff08;组长&#xff09; 负责计算器的图形设计&#xff0c;把输入和结果显…

模型评估:ROC曲线

二值分类器&#xff08;Binary Classifier&#xff09;是机器学习领域中最常见也是应用最广泛的分类器。评价二值分类器的指标很多&#xff0c;比如precision、recall、F1 score、P-R曲线等。相比而言&#xff0c;ROC曲线有很多优点&#xff0c;经常作为评估而知分类器最重要的…

斯坦福Mobile ALOHA提到的ACT之外的另两项技术:Diffusion Policy、VINN

前言 本文接上一篇文章《斯坦福机器人Mobile ALOHA的关键技术&#xff1a;动作分块ACT的算法原理与代码剖析》而来&#xff0c;当然最开始本文是作为上一篇文章的第二、第三部分的 但因为ACT太过关键&#xff0c;除了在上一篇文章中写清楚其算法原理之外&#xff0c;还得再剖…

如何在 Ubuntu 20.04 上安装 Node.js

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 20.04 上安装 Node.js 介绍 Node.js是用于服务器端编程的 JavaScript 运行时。它允许开发人员使…

基于jackson封装的json字符串与javaBean对象转换工具

文章目录 一、概述二、编码实现1. pom文件引入组件2. 核心代码 三、功能测试1. 测试文件2. 测试代码 四&#xff0c;完整代码 一、概述 带有API接口交互的web项目开发过程中&#xff0c;json字符串与javaBean对象之间的相互转换是比较常见的需求&#xff0c;基于jackson Objec…

数控开料机对比木工雕刻机的优势

数控开料机和木工雕刻机都属于木工机械加工设备&#xff0c;都可以用来开料和雕刻&#xff0c;但在市场价格、床体结构、技术要求等方面二者存在不小的差异&#xff0c;那么全自动数控开料机对比普通木工雕刻机有什么优势呢。 首先我们都知道&#xff0c;木工雕刻机主要应用于…

鸿蒙开发之组件不同状态样式设置stateStyles

开发中会有一种场景&#xff0c;组件&#xff08;如&#xff1a;按钮&#xff09;在不同状态下展示的样式不同。例如在normal状态和按下状态显示不同的样式&#xff0c;这个时候就可以通过stateStyles属性来设置组件。 Entry Component struct OfficialStateStylePage {State …

【5种常见的rpc封装方案】

1)回调(唯一callbackId) 1.显式回调写法 // 自己封装callbackId send(msgId, req, (data)->{ }) 隐式回调写法: send(msgId, req); ResHandler(data){ } 协程其实也算是隐式的写法&#xff0c;毕竟协程只能在进程内通信&#xff0c;只不过算是等到对方回复后&#xff0…

开启golang学习之路

Go 编程语言是一个开源项目&#xff0c;旨在提高程序员的工作效率。 Go 富有表现力、简洁、干净且高效。它的并发机制使编写能够充分利用多核和联网机器的程序变得容易&#xff0c;而其新颖的类型系统可以实现灵活和模块化的程序构建。 Go 可以快速编译为机器代码&#xff0c;…

Prometheus实战篇:Alertmanager配置概述及告警规则

Prometheus实战篇:Alertmanager配置概述及告警规则 在此之前,环境准备和安装我就不在重复一遍了.可以看之前的博客,这里我们直接步入正题. Alertmanager配置概述 Alertmanager主要负责对Prometheus产生的告警进行统一处理,因此在Alertmanager配置中一般会包含以下几个主要部分…

电脑提示dll丢失怎么办,教你一招将dll修复

使用电脑时&#xff0c;你的电脑是否出现关于dll文件丢失或找不到的问题&#xff0c;出现这种问题又该如何解决呢&#xff0c;dll文件问题会导致软件无法打开&#xff0c;或者会导致系统崩溃。今天就来教大家如何快速解决dll文件修复。 一.如何修复dll修复 方法一&#xff1a;…

虹科分享 | 实现网络流量的全面访问和可视性——Profitap和Ntop联合解决方案

文章速览&#xff1a; 为什么客户抱怨“网速太慢”&#xff1f;网络流量监控联合解决方案Profishark&Ntop联合解决方案的优势 这次和大家分享如何捕捉、分析和解读网络数据&#xff0c;从而更有效地监控网络流量&#xff0c;实现网络性能的最大化。先来看一个实际的问题—…

计算机体系结构----重排序缓冲(ROB)

ROB的思想&#xff1a;不按顺序完成指令&#xff0c;但在使结果对体系结构状态可见之前重新排序 当指令被解码时&#xff0c;它会在 ROB 中保留下一个顺序条目当指令完成时&#xff0c;它将结果写入 ROB 条目当指令在 ROB 中最早并且无一例外地完成时&#xff0c;其结果移动到…

HJ12 字符串反转

题目描述 接受一个只包含小写字母的字符串&#xff0c;然后输出该字符串反转后的字符串。&#xff08;字符串长度不超过1000&#xff09; 题目来源 题目来源 输入描述 输入一行&#xff0c;为一个只包含小写字母的字符串。 输出描述&#xff1a; 输入一行&#xff0c;为一…

mathglm代码调试记录

论文地址&#xff1a;https://arxiv.org/pdf/2309.03241v2.pdf 项目地址&#xff1a;https://github.com/THUDM/MathGLM#arithmetic-tasks 数据集格式&#xff1a; 读取数据集代码&#xff1a; def make_loaders(args, create_dataset_function):"""makes t…

检测并批量导出项目文件中所有最近修改文件的实用工具

本篇文章主要讲解工具的使用和操作教程&#xff0c;这是一个能够检测项目内最近修改的文件并保留路径导出文件的实用工具。 日期&#xff1a;2024年1月10日 工具介绍&#xff1a; 这是一款可以帮助你自动检测并导出指定文件修改时间内的文件及文件目录的实用工具&#xff0c;在…

PDO【配置】

PDOr: 6040 控制字 6060 模式 6083 加速度 6084 减速度 =====================【定位1】:// 补间7 607A 定位位置 6081 定位速度 =====================【速度3】: 60FF 目标速度 =====================【力矩4…

Python语言基础

目录 任务驱动式学习 任务一&#xff1a;输出问候语 一、Python程序的两种编程模式 二、Python程序的执行方式——解释执行 三、基本输入输出函数 任务二&#xff1a;计算圆的周长和面积 一、语句块缩进 二、变量与对象 三、数据类型及转换 四、数字类型及运算 五、…

在 WinForms 应用程序中实现 FTP 文件操作及模式介绍

在 WinForms 应用程序中实现 FTP 文件操作及模式介绍 简介 在许多应用程序中&#xff0c;能够从远程服务器获取文件是一个非常有用的功能。本文将详细介绍如何在 Windows Forms (WinForms) 应用程序中使用 FTP 协议进行文件操作&#xff0c;包括连接到 FTP 服务器、列出目录、…

(每日持续更新)jdk api之DataInputStream基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…