设计模式-策略模式

文章目录

  • 策略模式

策略模式

策略模式是一种行为型设计模式,它允许在运行时动态改变对象的行为。在策略模式中,算法被封装在独立的策略类中,使得它们可以互换使用。下面是一个简单的例子:

假设我们有一个计算税收的系统,现在需要计算不同类型的商品的税收,例如书籍、食品和服装。每种商品的税收计算方法都不一样,因此我们可以把每种计算方法都封装在一个具体的策略类中,最终让客户端根据商品类型动态地选择相应的策略进行计算税收。

所谓策略模式就是定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

例如:我们对一个数组进行排序,但是我们不知道数组类型,并且不同数组的排序方式也是不一样的。

public class Cat {int weight, height;public Cat(int weight, int height){this.weight = weight;this.height = height;}@Overridepublic String toString() {return "Cat{" +"weight=" + weight +", height=" + height +'}';}}
@FunctionalInterface
public interface Comparator<T> {int compare(T o1, T o2);
}
/*** 比较器  策略模式的实现* 一个接口,类实现这个接口,将策略封装在这个类中,这样就可以由多个策略即多个类* 比如线程池的拒绝策略*/
public class CatComparator implements Comparator<Cat>{@Overridepublic int compare(Cat o1, Cat o2) {if (o1.weight < o2.weight){return -1;}else if(o1.weight > o2.weight){return 1;}else {return 0;}}
}
public class Sorter<T> {public void sort(T[] arr, Comparator<T> comparator){for (int i = 0; i < arr.length; i++) {int minPos = i;for (int j = i+1; j < arr.length; j++) {minPos = comparator.compare(arr[j], arr[minPos]) == -1 ? j : minPos;}swap(arr, i, minPos);}}void swap(T[] arr, int i, int j) {T cat = arr[i];arr[i] = arr[j];arr[j] = cat;}
}
/*** 策略模式* Comparable* Comparator* 对数组进行排序*/
public class Strategy01 {public static void main(String[] args) {
//        int[] a = {9,2,1,3,5,0};Cat[] a = {new Cat(3,3), new Cat(5,5),new Cat(2,2)};Sorter<Cat> sorter = new Sorter();sorter.sort(a, new CatComparator());
//        //也可以简化实现
//        sorter.sort(a, (o1, o2) -> {
//            if (o1.weight < o2.weight){
//                return -1;
//            }else if(o1.weight > o2.weight){
//                return 1;
//            }else {
//                return 0;
//            }
//        });System.out.println(Arrays.toString(a));}
}

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

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

相关文章

2022年全国职业院校技能大赛高职组软件测试赛项赛题评分标准

任务 考查点 评分标准 评分细则 分值 任务一 环境搭建及系统部署 &#xff08;5分&#xff09; 环境搭建及系统部署包括搭建与配置测试环境&#xff0c;安装与部署应用系统等&#xff0c;对过程和结果进行截图&#xff0c;完成环境搭建及系统部署报告 1.测试环境搭建与…

小程序附件下载并预览功能

一、实现的功能&#xff1a; 1、word、excel、图片等实现下载并预览 2、打开文件后显示文件名称 二、代码&#xff1a; // 判断文件类型whatFileType(url) {let sr url.lastIndexOf("."); // 最后一次出现的位置let fileType url.substr(sr 1); // 截取url的…

超越传统测试:如何构建可靠的持续集成测试管道

超越传统测试&#xff1a;如何构建可靠的持续集成测试管道 引言 持续集成测试是现代软件开发中至关重要的一环&#xff0c;它可以帮助团队及时发现和解决代码问题&#xff0c;提高软件质量。然而&#xff0c;传统的测试方法往往存在效率低、容易出错等问题。本篇博客将介绍如…

Java接口通过token登录实现页面跳转到登录成功后的页面

首先&#xff0c;你需要在接口请求中将token作为参数传递给后端&#xff0c;后端需要对token进行验证并获取登录用户的信息。 在验证通过后&#xff0c;你可以将登录成功后的页面链接返回给前端&#xff0c;前端通过跳转到该链接来实现页面跳转。 以下是一个简单的Java代码演…

手机图片转pdf?两种方法介绍

手机图片转pdf&#xff1f;如今&#xff0c;随着生活的数字化&#xff0c;我们的手机中储存了大量的照片。但是&#xff0c;如果需要将这些照片转换成PDF格式&#xff0c;该怎么办呢&#xff1f;下面&#xff0c;小编就给大家介绍三种方法来实现这一目标。 第一种方法&#xff…

12页线性代数图解教程,github星标9.1k,适合小白

线性代数“困难户”注意&#xff0c;今天我给大家分享一个超适合小白的线性代数学习笔记&#xff0c;只有12页纸&#xff0c;一半都是图解&#xff0c;不用担心看不懂。 这份笔记名为《线性代数的艺术》&#xff0c;是日本学者Kenji Hiranabe基于Gilbert Strang教授的《每个人…

JS常用操作数组的方法整理

JavaScript提供了许多用于操作数组的方法。以下是其中一些常见的方法&#xff1a; 1. push() : 将一个或多个元素添加到数组的末尾&#xff0c;并返回新数组的长度。 2. pop() : 移除并返回数组的最后一个元素。 3. unshift() : 将一个或多个元素添加到数组的开头&#xff0…

【Pytorch学习】pytorch中的isinstance() 函数

描述 isinstance() 函数来判断一个对象是否是一个已知的类型&#xff0c;类似 type()。 isinstance() 与 type() 区别&#xff1a; type() 不会认为子类是一种父类类型&#xff0c;不考虑继承关系。 isinstance() 会认为子类是一种父类类型&#xff0c;考虑继承关系。 如果要判…

Lambda表达式常见的Local variable must be final or effectively final原因及解决办法

目录 Local variable must be final or effectively final错误原因 解决办法按照要求定义为final&#xff08;不符合实情&#xff0c;很多时候是查库获取的变量值&#xff09;使用原子类存储变量&#xff0c;保证一致性AtomicReference常用原子类 其它 Local variable must be …

为什么要有虚拟内存?

操作系统是通过内存分段和内存分页的方式管理虚拟内存地址和物理内存地址之间的关系 内存分段 程序是由若干个逻辑分段组成的&#xff0c;代码分段、数据分段、栈段、堆段组成&#xff0c;不同的段有不同的属性&#xff0c;所以就用分段的形式分离开。 分段机制下的虚拟内存…

JVM理论(七)性能监控与调优

概述 性能优化的步骤 性能监控&#xff1a;就是通过以非强行或入侵方式收集或查看应用程序运行状态,包括如下问题 GC频繁CPU过载过高OOM内存泄漏死锁程序响应时间较长性能分析&#xff1a;通常在系统测试环境或者开发环境进行分析 通过查看程序日志以及GC日志,或者运用命令行工…

《零基础入门学习Python》第070讲:GUI的终极选择:Tkinter7

上节课我们介绍了Text组件的Indexs 索引和 Marks 标记&#xff0c;它们主要是用于定位&#xff0c;Marks 可以看做是特殊的 Indexs&#xff0c;但是它们又不是完全相同的&#xff0c;比如在默认情况下&#xff0c;你在Marks指定的位置中插入数据&#xff0c;Marks 的位置会自动…

yaml语法详解

#kv #对空格的严格要求十分高 #注入到我们的配置类中 #普通的keyvalue name: qinjiang#对象 student:name: qingjiangage: 3#行内写法 student1: {name: qinjiang,age: 3}#数组 pets:- cat- dog- pigpet: [cat,dog,pig]yaml可以给实体类赋值 person:name: kuangshenage: 19happ…

Android onTouchEvent方法不触发ACTION_UP的解决方法

Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN://触摸、按下setImageResource(R.mipmap.ic_music);break;case MotionEvent.ACTION_UP://抬起setImageResource(R.mipmap.ic_launcher);break;}return sup…

ERROR 1064 - You have an error in your SQL syntax;

ERROR 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near (/, 少个逗号吧&#xff0c;以前开始写SQL&#xff0c;特别是修改SQL的时候容易出现这样错误。 而且自己也知道在附近…

前端异常错误处理(包括但不限于react,vue)

错误异常发生 页面js报错请求报错页面资源加载报错promise异常iframe加载异常页面奔溃&卡顿异常 处理异常的方法 1、react 自带的errorBoundaries 2、 react 自定义Hooks 3、 vue errorHandler 4、try catch 对特定的代码进行捕获 5、window.addEventListerner …

【深度学习】日常笔记15

训练集和测试集并不来⾃同⼀个分布。这就是所谓的分布偏移。 真实⻛险是从真实分布中抽取的所有数据的总体损失的预期&#xff0c;然⽽&#xff0c;这个数据总体通常是⽆法获得的。计算真实风险公式如下&#xff1a; 为概率密度函数 经验⻛险是训练数据的平均损失&#xff0c;⽤…

【MySQL主从复制】

目录 一、MySQL Replication 1.概述 2.优点 二、MySQL复制类型 1.异步复制&#xff08;Asynchronous repication&#xff09; 2.全同步复制&#xff08;Fully synchronous replication&#xff09; 3.半同步复制&#xff08;Semisynchronous replication&#xff09; 三…

【Rust 基础篇】Rust FFI:连接Rust与其他编程语言的桥梁

导言 Rust是一种以安全性和高效性著称的系统级编程语言&#xff0c;具有出色的性能和内存安全特性。然而&#xff0c;在现实世界中&#xff0c;我们很少有项目是完全用一种编程语言编写的。通常&#xff0c;我们需要在项目中使用多种编程语言&#xff0c;特别是在与现有代码库…

ava版知识付费平台免费搭建 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发定制&#xff0c;源码交付。 Java版知识付费-轻松拥有知识付费平台 多种直播形式&#xff0c;全面满足直播场景需求 公开课、小班课、独…