设计模式-策略模式(行为型)

行为型-策略模式

了解策略模式

策略模式是一种行为型设计模式,在策略模式中定义了一系列算法或者策略,并将这些策略封装到独立的类中,使得可以相互替换。在使用时,可以指定响应的策略使用。

角色

  1. 策略接口:对于某种行为的抽象,具体的行为由实现类决定;
  2. 具体策略类:实现策略接口,具体化其中的策略行为;
  3. 上下文类:次类中包含策略对象的引用,并通过引用调用策略实现类;

图解

在这里插入图片描述

实战

比较策略,可以根据不同的策略进行排序;

实体类:

/** 动物类*/
public class Animal {private int height;private int weight;……
}
/** 人类*/
public class Person {private int weight;private double height;private BigDecimal money;……
}

策略接口:

/** 自定义比较的策略接口*/
public interface Comparator<T> {int compareTo(T o1,T o2);
}

策略的实现类:

/** 按动物的重量比较动物*/
public class AnimalComparatorByHeight implements Comparator<Animal> {@Overridepublic int compareTo(Animal o1, Animal o2) {if(o1.getHeight()<o2.getHeight()){return -1;}else if (o1.getHeight() > o2.getHeight()){return 1;}else {return 0;}}
}
/** 按人的钱数量比较人*/
public class PersonComparatorByMoney implements Comparator<Person> {@Overridepublic int compareTo(Person o1, Person o2) {if(o1.getMoney().compareTo(o2.getMoney()) < 0){return -1;}else if(o1.getMoney().compareTo(o2.getMoney()) > 0){return 1;}else{return 0;}}
}
/** ……* 还可一定义其它的排序策略,只需要实现策略接口*/

context类:

/** 排序类,可根据不同的策略排序不同的对象*/
public class Sorter<T> {private Comparator<T> comparator;private T [] arr;public Sorter() {}public Sorter(Comparator<T> comparator, T[] arr) {this.comparator = comparator;this.arr = arr;}/*** 冒泡排序*/public void sort(){for (int i = 0; i < arr.length -1; i++) {for (int j = 0; j < arr.length -1 -i; j++) {if(comparator.compareTo(arr[j], arr[j+1]) > 0){change(j,j+1);}}}}public void change(Integer a, Integer b){T temp = arr[a];arr[a] = arr[b];arr[b] = temp;}
}

使用:

public class Test {public static void main(String[] args) {/***  根据动物重量排序*/Animal[] animals = new Animal[]{new Animal(3,3),new Animal(5,5),new Animal(1,1),new Animal(4,4)};Sorter<Animal> animalSorter = new Sorter<>(new AnimalComparatorByHeight(),animals);animalSorter.sort();System.out.println(Arrays.toString(animals));/*** 根据人钱数量排序*/Person[] person = new Person[]{new Person(3,3,new BigDecimal(900)),new Person(5,5,new BigDecimal(300)),new Person(1,1,new BigDecimal(500)),new Person(4,4,new BigDecimal(600))};Sorter<Person> personSorter = new Sorter<>(new PersonComparatorByMoney(),person);personSorter.sort();System.out.println(Arrays.toString(person));}
}

总结

使用策略模式定义行为的抽象,行为的具体方式由实现类实现;如果再添加其他行为的时候只需要增加策略接口的实现类,而不需要修改现有的代码,提高了代码的拓展性能,同时保证的对拓展开放对修改关闭的开闭原则;

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

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

相关文章

【uCOS-III-编程指南】

uCOS-III-编程指南 ■ [野火]uCOS-III内核实现与应用开发实战指南■■■■ ■ [野火]uCOS-III内核实现与应用开发实战指南 添加链接描述 ■ ■ ■ ■

uniPush2.0消息推送(云对象)

1.创建uniCloud云开发环境 关联云服务空间&#xff08;没有云空间到官网上创建&#xff09;步骤如下 2. index.obj.js代码 &#xff0c;然后上传部署 // 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj // jsdoc语法提示教程&#xff1a;https://ask.dc…

STM32电子实战项目(一)记录:BLDC kitchen prep centre

产品目的&#xff1a; 解决搅拌机食材粘壁问题。 产品功能及需求分析&#xff1a; 需求分析及实现可能性&#xff1a; 从项目需求看&#xff0c;该项目要实现的功能并不复杂&#xff0c;控制电机的正反转及对应LED显示即可&#xff0c;同时也没必要控制电机转速&#xff0c;…

如何根据业务需求,轻松挑选SSL证书?

在当今数字化时代&#xff0c;网站的安全性愈发受到重视。SSL证书作为网站安全的“守门员”&#xff0c;不仅能保护用户数据不被窃取&#xff0c;还能提升网站的信任度。但面对市场上琳琅满目的SSL证书产品&#xff0c;如何根据业务需求挑选合适的证书呢&#xff1f;今天&#…

流量分析——一、蚁剑流量特征

君衍. 一、Webshell特征流量分析二、环境介绍三、使用Wireshark进行流量分析1、环境说明2、HTTP追踪流分析3、蚁剑请求体中代码块解读 四、使用BurpSurite进行流量分析1、环境配置2、抓包分析 六、总结 一、Webshell特征流量分析 对于重保、护网等攻防演练的防守方来说&#x…

wps:样式集的使用【笔记】

wps&#xff1a;样式集的使用【笔记】 前言版权推荐wps&#xff1a;样式集的使用1拿到一个内容模板2修改样式集3修改样式的详细说明4保存样式集5应用样式集 说明另外最后 前言 2024-6-5 23:36:20 以下内容源自《【笔记】》 仅供学习交流使用 版权 禁止其他平台发布时删除以…

LLM大语言模型(十六):最新开源 GLM4-9B 本地部署,带不动,根本带不动

目录 前言 本机环境 GLM4代码库下载 模型文件下载&#xff1a;文件很大 修改为从本地模型文件启动 启动模型cli对话demo 慢&#xff0c;巨慢&#xff0c;一个字一个字的蹦 GPU资源使用情况 GLM3资源使用情况对比 前言 GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 …

bpmn+vue 中文文档

1.初始化项目 <script> import BpmnModeler from bpmn-js/lib/Modeler import { xmlStr } from /mock/xmlStr export default {mounted () {this.init()},methods: {init () {// 获取到属性ref为“canvas”的dom节点const canvas this.$refs.canvas// 建模const custom…

Apache Superset:数据可视化的现代开源解决方案

Superset&#xff1a; 洞察数据&#xff0c;一目了然- 精选真开源&#xff0c;释放新价值。 概览 Apache Superset 是一个由 Apache 软件基金会支持的开源数据可视化和数据探索平台。它允许用户以直观的方式构建丰富的数据报告和仪表板&#xff0c;支持从多种数据源中提取数据…

2024版本---LabVIEW 软件安装及使用教程

目录 第1章 LabVIEW 软件安装及使用教程 1. 简介 2. 安装教程 2.1 下载 LabVIEW 2024 版本 2.2 安装 LabVIEW 3. 激活 LabVIEW 4. LabVIEW 基本使用教程 4.1 用户界面介绍 4.2 创建一个简单的 VI&#xff08;虚拟仪器&#xff09; 4.3 数据采集示例 5. 进阶功能介绍…

FCA-FinBI 试题及答案

第1题【判断题】在分析主题内添加数据时&#xff0c;能够选择批量添加数据。 A. 正确B. 错误 正确答案&#xff1a;A 第2题【判断题】在编辑数据的时候可以调整字段的先后顺序。 A. 正确B. 错误 正确答案&#xff1a;A 第3题【判断题】FineBI数据加工建模中只支持文本、数值、…

Educational Codeforces Round 103 (Rated for Div. 2) A. K-divisible Sum 题解 构造

K-divisible Sum 题目描述 You are given two integers n n n and k k k. You should create an array of n n n positive integers a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1​,a2​,…,an​ such that the sum ( a 1 a 2 ⋯ a n ) (a_1 a_2 \dots a_n) (a…

如何将华为Ascend手机的短信和联系人安全传输到电脑

华为Ascend系列手机以其流畅的使用体验、光滑的触感以及轻巧的设计赢得了市场的青睐。不仅如此&#xff0c;Ascend系列手机还以亲民的价格和出色的用户体验&#xff0c;搭载了众多先进功能&#xff0c;如Ascend P6的4.7英寸大屏、海思四核处理器、2GB RAM和800万像素摄像头等。…

深入理解HTTP与TCP:应用层与传输层的区分

一、前言 在互联网协议栈中&#xff0c;应用层和传输层是两个重要的层级&#xff0c;分别承载了不同的功能。HTTP&#xff08;HyperText Transfer Protocol&#xff09;作为应用层协议&#xff0c;而TCP&#xff08;Transmission Control Protocol&#xff09;则是传输层协议&…

66、API攻防——接口安全阿里云KEYPostmanDVWS

文章目录 一、工具使用——Postman自动化测试二、安全问题——Dvws泄露&鉴权&XXE三、安全问题——阿里KEY信息泄露利用 dvws-node 一、工具使用——Postman自动化测试 二、安全问题——Dvws泄露&鉴权&XXE 路径中出现/api/&#xff0c;一般都是接口。 请求包是…

qt 画多边形,可以拖拽

目录 qt 画多边形,顶点拖拽是局部拖拽,中间拖拽是整体拖拽 每秒更新图片

宏集Panorama SCADA:个性化定制,满足多元角色需求

前言 在考虑不同人员在企业中的职能和职责时&#xff0c;他们对于SCADA系统的需求可能因其角色和工作职责的不同而有所差异。在SCADA系统的设计和实施过程中&#xff0c;必须充分考虑和解决这种差异性。 为了满足不同人员的需求, 宏集Panorama SCADA平台具备灵活的功能和定制…

Spring Boot 应用打 WAR 包后无法注册到 Nacos怎么办

你好&#xff0c;我是柳岸花开。 在微服务架构中&#xff0c;服务注册与发现是至关重要的一环。Nacos 作为阿里巴巴开源的注册中心&#xff0c;能够很好地满足这一需求。然而&#xff0c;在将 Spring Boot 应用打包成 WAR 部署到外部服务器时&#xff0c;可能会遇到服务无法注册…

gitlab-jh的docker容器自动退出/gitlab镜像版本/升级问题

背景 上个月用docker部署了一个gitlab-jh的服务&#xff0c;给小组上传代码使用&#xff0c;这个月由于机器故障重装系统&#xff0c;当我重新部署好gitlab后发现docker容器启动后会闪退&#xff0c;为寻因果&#xff0c;故作此篇 docker-compose.yml 文件 version: 3.6 ser…

基于R语言BIOMOD2 及机器学习方法的物种分布模拟

BIOMOD2是一个R软件包&#xff0c;用于构建和评估物种分布模型&#xff08;SDMs&#xff09;。它集成了多种统计和机器学习方法&#xff0c;如GLM、GAM、SVM等&#xff0c;允许用户预测和分析物种在不同环境条件下的地理分布。通过这种方式&#xff0c;BIOMOD帮助研究者评估气候…