什么是Java中的策略模式?

Java中的策略模式是一种行为设计模式,它允许您在不改变客户端代码的情况下,在运行时动态地切换行为。这是一种非常有用的模式,因为它允许您在运行时根据需要更改算法或行为。

策略模式通常涉及到一个或多个策略类,每个策略类都实现一个接口,该接口定义了执行操作的方法。客户端代码使用一个接口引用指向策略类的对象,从而可以在运行时更改行为。

下面是一个简单的Java代码示例,演示了如何使用策略模式:

// 定义一个接口
interface Calculator {int add(int a, int b);
}// 实现策略类1
class StrategyA implements Calculator {public int add(int a, int b) {return a + b;}
}// 实现策略类2
class StrategyB implements Calculator {public int add(int a, int b) {return b + a; // 注意这里的加法顺序与StrategyA相反}
}// 客户端代码
public class Client {private Calculator calculator; // 指向策略类的对象public Client(Calculator calculator) {this.calculator = calculator; // 初始化策略类的对象}public int add(int a, int b) {return calculator.add(a, b); // 使用策略类的对象执行操作}
}

在上面的示例中,我们定义了一个Calculator接口,它有一个add方法,用于执行加法操作。然后我们定义了两个实现StrategyA和StrategyB的类,它们都实现了Calculator接口,并实现了add方法。最后,我们在客户端代码中创建了一个Client对象,它使用StrategyA或StrategyB来执行加法操作。通过这种方式,我们可以根据需要更改算法或行为,而无需修改客户端代码。


下面是一个简单的示例,展示如何使用策略模式来替换一个类的行为:

public class MeatMeal implements Meal {public void prepare() {System.out.println("Preparing a meat meal...");}
}public class VegMeal implements Meal {public void prepare() {System.out.println("Preparing a vegetarian meal...");}
}public class EatingHouse {private Meal currentMeal;public EatingHouse() {currentMeal = new MeatMeal(); // 初始化当前Meal对象为MeatMeal}public void setMealType(String type) { // 用于更换Meal对象的实现switch(type) {case "meat":currentMeal = new MeatMeal();break;case "vegetarian":currentMeal = new VegMeal();break;default:System.out.println("Invalid meal type!");break;}}public void eat() { // 调用Meal对象的prepare方法来准备食物currentMeal.prepare();}
}

在这个例子中,我们定义了两个实现Meal接口的类:MeatMeal和VegMeal。我们还创建了一个EatingHouse类,它包含一个Meal对象和一个用于更换Meal对象的setMealType方法。在EatingHouse的构造函数中,我们初始化当前Meal对象为MeatMeal。然后,我们可以在setMealType方法中使用switch语句来更换当前的Meal对象。最后,我们可以在eat方法中调用当前Meal对象的prepare方法来准备食物。

在上面的代码中,我们使用了switch语句来根据输入的值来选择适当的Meal对象。这可能看起来有些繁琐,但在实际应用中,这可以让代码更加灵活和可扩展。如果您需要在EatingHouse类中使用多个不同的Meal对象,那么您只需要添加更多的case到switch语句中即可。此外,如果您需要添加更多的行为到当前的Meal对象中,您只需要添加一个新的实现类并使用setMealType方法将其设置为当前的Meal对象即可。

在策略模式中,我们可以通过添加新的策略类来扩展功能,而无需修改客户端代码。这种方式非常灵活,因为我们可以根据需要更改算法或行为,而无需修改现有的代码。这也是策略模式的一个重要优点。

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

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

相关文章

为c语言安装easyx图形库

按照图上的步骤&#xff0c;安装easyx图形库。 接下来看代码&#xff1a; #include<easyx.h> #include<stdio.h> #define width 800 #define height 600int main() {initgraph(width, height); // 初始化窗口&#xff08;宽度&#xff0c; 高度&#xff09;…

SAS-proc transpose转置

一、语法 by&#xff1a;纵向变量&#xff0c;不转置&#xff0c;保留的变量&#xff0c;by使用需要先排序。 id&#xff1a;需要转置的变量。 var&#xff1a;新数据集中的数据。 idlabel&#xff1a;转置变量的标签。 copy&#xff1a;不转置的变量直接拷贝到输出数据集中。…

C语言必会题目(1)

W...Y的主页 &#x1f60a; 代码仓库分享❤️ 在学习语言时&#xff0c;最重要的就是练习&#xff0c;光听不练假把式。下面我就推荐一些C语言必会的题。 执行下面程序&#xff0c;正确的输出是&#xff08; &#xff09; int x5,y7; void swap() { int z; zx; xy; yz; } int…

北航基于openEuler构建工业机器人操作系统,打造“开箱即用”的机器人基础软件平台

北京航空航天大学是国家“双一流”建设高校&#xff0c;以建设扎根中国大地的世界一流大学为发展目标。北京航空航天大学在机器人领域一直处于行业前沿&#xff0c;以其亮眼的成果和优秀的师资力量&#xff0c;成为国内机器人领域的重要参与者和建设者。机器人操作系统是机器人…

说说var、let、const之间的区别?

一、var 在ES5中&#xff0c;顶层对象的属性和全局变量是等价的&#xff0c;用var声明的变量既是全局变量&#xff0c;也是顶层变量 注意&#xff1a;顶层对象&#xff0c;在浏览器环境指的是window对象&#xff0c;在 Node 指的是global对象 var a 10; console.log(window.…

【Kubernetes】Kubernetes之Kubeadm部署

Kubeadm 一、Kubeadm 部署1. 环境准备2. 所有节点安装 docker3. 所有节点安装 kubeadm&#xff0c;kubelet 和 kubectl4. 部署 K8S 集群4.1 配置 master01 节点4.2 配置 node 节点 二、Kubeadm 高可用部署1. 环境准备2. 所有节点安装 docker2. 所有节点安装kubeadm&#xff0c;…

Substack 如何在去中心化内容创作领域掀起波澜

面对数字内容广告化的困境&#xff0c;Substack回归做内容的初心&#xff0c;通过产品和平台双轮驱动&#xff0c;重塑一个去中心化的多元文化内容聚集地&#xff0c;实现了增长突破。其核心策略在于先使用简洁的创作工具赋能内容生产&#xff0c;进而通过平台的互动机制促进用…

链式二叉树统计结点个数的方法和bug

方法一&#xff1a; 分治&#xff1a;分而治之 int BTreeSize1(BTNode* root) {if (root NULL) return 0;else return BTreeSize(root->left)BTreeSize(root->right)1; } 方法二&#xff1a; 遍历计数&#xff1a;设置一个计数器&#xff0c;对二叉树正常访问&#…

Git入门到精通——保姆级教程(涵盖GitHub、Gitee、GitLab)

文章目录 前言一、Git1.Git-概述1.1.Git-概述-版本控制介绍1.2.Git-概述-分布式版本控制VS集中式版本控制1.3.Git-概述-代码托管中心1.4.Git-概述-安装和客户端的使用 2.Git-命令(常用命令)2.1.Git-命令-设置用户签名2.2.Git-命令-初始化本地库2.3.Git-命令-查看本地库状态2.4.…

Python删除列表中的多个元素【四种方法】

文章目录 1 使用切片删除多个元素2 使用列表解析3 利用romove()函数4 利用pop()函数 1 使用切片删除多个元素 利用索引进行对应索引元素的删除 改变原始列表 my_list [1, 2, 3, 4, 5, 6, 7, 8, 9] del my_list[2:5] # 删除索引2到4之间的元素 print(my_list) # [1, 2, 6, 7…

如何解决新学期分班查询公布难题?试试这个方法

作为教师&#xff0c;我们常常需要进行学生分班管理&#xff0c;这项工作繁琐但至关重要。为了提高工作效率&#xff0c;我们可以利用现代技术开发一款学生分班查询系统。本文将介绍如何设计和开发这个系统。 首先&#xff0c;我们可以选择使用易查分这样的工具来帮助我们管理…

Java多线程(九)

目录 一、synchronized基本特点 二、synchronized加锁工作过程 2.1 无锁 2.2 偏向锁 2.3 轻量级锁 2.4 重量级锁 三、synchronized其他优化操作 3.1 锁消除 3.2 锁粗化 一、synchronized基本特点 开始是乐观锁&#xff0c;如果锁冲突频繁就会转换成悲观锁开始是轻量级锁&#x…

【java】mybatis-plus代码生成

正常的代码生成这里就不介绍了。旨在记录实现如下功能&#xff1a; 分布式微服务环境下&#xff0c;生成的entity、dto、vo、feignClient等等api模块&#xff0c;需要和mapper、service、controller等等分在不同的目录生成。 为什么会出现这个需求&#xff1f; mybatis-plus&am…

概率论:多维随机变量及分布

多维随机变量及分布 X X X为随机变量&#xff0c; ∀ x ∈ R , P { X ≤ x } F ( x ) \forall x\in R,P\{X\le x\}F(x) ∀x∈R,P{X≤x}F(x) 设 F ( x ) F(x) F(x)为 X X X的分布函数&#xff0c;则 &#xff08;1&#xff09; 0 ≤ F ( x ) ≤ 1 0\le F(x)\le1 0≤F(x)≤1 &am…

赛码网-triangle(dp) 100%AC代码(C)

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在准备秋招&#xff0c;一直在练习编程。 ⏩本篇文章对赛码网的01串的魔法 题目做…

【积水成渊】CSS磨砂玻璃效果和渐变主题色文字

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcyllqj/category_12346639.html?spm1…

Android AlertDialog标题居中

网上很多做法都是使用setCustomTitle方法实现的&#xff0c;我偏不&#xff0c;因为我已经找到了标题的textView了&#xff1a; 在show了之后可以拿到标题&#xff08;注意一定是show之后才能拿得到&#xff0c;create之后拿也是空的&#xff09;&#xff1a; TextView title…

优思学院|6西格玛标准值水平是多少?

在质量管理和统计学领域&#xff0c;"6西格玛" 是一个重要的概念&#xff0c;它与产品和流程的质量有着密切的关系。本文将解释"6西格玛"标准值水平是什么&#xff0c;以及它在各个行业中的应用。 什么是6西格玛标准值水平&#xff1f; 理解西格玛 西格…

《练习100》86~90

题目86 # 生成一个包含20个随机整数&#xff08;100以内&#xff09;的列表&#xff0c;对其中偶数索引&#xff08;下标&#xff09;的数据进行降序排列&#xff0c;奇数索引的元素不变 import random list1 [random.randint(0,100) for _ in range(20)] list2 list1[::2] …

非科班出身的人想要顺利地转型成为编程领域的专业人士的建议

目录 1、具体方法2、成功案列 非科班想要丝滑转码&#xff0c;可以参考下述步骤&#xff1a; 1、具体方法 了解想要从事的领域&#xff1a;比如前端开发、数据分析、产品经理等。通过互联网进行调查&#xff0c;了解这些领域的职责、技能需求、发展前景等。学习基础知识&#…