03-JAVA设计模式-策略模式

策略模式

什么是策略模式

策略模式(Strategy Pattern)是行为设计模式之一,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的上下文对象。策略对象更改上下文对象的执行算法。

优点:

  • 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法族,恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
  • 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么在这些算法或行为特别多的情况下,使用继承方式,会造成子类膨胀,使用策略模式可以避免这个问题。
  • 使用策略模式可以避免使用多重条件转移语句。多重条件转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件选择语句里面,比使用继承的办法还要原始和落后。

缺点:

  • 客户端必须知道不同策略的存在,并自行决定使用哪一个策略。
  • 策略模式将造成产生很多策略类,增加了代码的复杂性。

策略模式对应于解决某一个问题的算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法,并且有客户端决定调用那个算法。

案例

使用策略模式,对应两个数进行加减乘除操作

UML

在这里插入图片描述

实现步骤:

  • 定义操作接口,为具体实现算法的创建提供统一的接口类
  • 创建具体的策略类,实现加减乘除不同的算法
  • 创建上限文对象,对象中持有策略算法的引用,提供调用方法,通过持有的策略算法的引用实现不同算法的调用

实现代码

Strategy.java

// 策略接口
public interface Strategy {// 定义操作接口int dealOperation(int num1,int num2);
}

OperationAdd.java

// 具体策略类-加法
public class OperationAdd implements Strategy{@Overridepublic int dealOperation(int num1, int num2) {return num1 + num2;}
}

OperationSubtract.java

// 具体策略类-减法
public class OperationSubtract implements Strategy {@Overridepublic int dealOperation(int num1, int num2) {return num1 - num2;}
}

OperationMultiply.java

// 具体策略类-乘法
public class OperationMultiply implements Strategy {@Overridepublic int dealOperation(int num1, int num2) {return num1 * num2;}
}

OperationDivide.java

// 具体策略类-除法
public class OperationDivide implements Strategy {@Overridepublic int dealOperation(int num1, int num2) {return num1 / num2;}
}

Context.java

// 上限文类
public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return strategy.dealOperation(num1, num2);}
}

TestClient.java

public class TestClient {public static void main(String[] args) {Context context = new Context(new OperationAdd());System.out.printf("选择加法-执行结果:%s%n",context.executeStrategy(5,2));context = new Context(new OperationMultiply());System.out.printf("选择乘法-执行结果:%s%n",context.executeStrategy(5,2));}
}

执行结果:

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

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

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

相关文章

如何瓜分1.35亿美元的园艺市场?赛盈分销圈货活动即将开启!

庭院一直以来是欧美国家大多数家庭的重要使用场景,尤其在每年夏季都会进行庭院爆改。 人们通过修剪草坪、花草种植、庭院装饰、野营烧烤等形式增添户外庭院另一种更加休闲、新颖的生活方式。 Google Trends预测到2035年全球居家园艺市场达到1.35万亿美元&#xff0c…

500强企业如何打造高效的差旅供应链?

在构建差旅管理平台的过程中,很多企业差旅管理负责人常常面临一个关键问题:差旅供应链怎么搭建? 企业差旅供应链的建设是一个复杂的系统工程,涉及多个方面,包括但不限于供应商的选择与管理、技术平台的搭建、流程设计、…

Docker资源控制管理

目录 一.CPU 资源控制 1.定义 2.cgroups四大功能 (1)资源限制:可以对任务使用的资源总额进行限制 (2)优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优…

pycharm-ieda-phpstorm超级好用插件,一键解释代码

功能:解释你看不懂的代码 当你在写python和Java代码的时候,总有你看不懂的代码,怎么办?csdn搜?那不麻烦,直接插件解决。 来安装:文件-设置 点击插件-Marketplace-搜索通义灵码 安装完成后&…

GitHub介绍,GitHub如何订阅充值?

一、GitHub介绍 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名Github。 GitHub于2008年4月10日正式上线,除了git代码仓库托管及基本的Web管理界面以外,还提供了订阅、讨论组、…

Windows系统引导重建,Windows引导损坏修复

Windows系统引导重建 引导是一个非常**「脆弱」的东西,对系统、分区**的操作都有可能导致其出现问题。 比如分区操作不当、不小心格式化某个分区、误删看不懂的文件,这与你用什么软件操作无关。 而引导只要出现问题,你的电脑就无法进入系统…

go语言通过TCP协议实现聊天室样例

目录 1、服务端: 2、客户端: 3、实现效果 1、服务端: package mainimport ("fmt""net""sync" )type ChatServer struct {clients map[string]net.ConnclientsMux sync.Mutex }func NewChatServer() *Ch…

功能测试_分类_用例_方法

总结 测试分类 按阶段分类 是否查看源代码分类 是否运行分类 是否自动化 其他分类 软件质量模型 开发模型-瀑布模型 测试过程模型 v w 测试用例八大要素 用例编号 用例标题 …

【delphi 】常用资源网站

在Delphi的日常开发中,经常会用到第三方资源,本文收集的是开源的资源,建议收藏,以备不时之需! 目录 一、通用资源 1. JCL 2. JVCL 3. Alcinoe (mirror at GH) 4. Fundamentals Code Library 5. Spring4D 6. The…

装饰器模式【结构型模式C++】

1.概述 装饰器模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 2.结构 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。具体构件(Concre…

Cmake Learn

目录 1 常用命令 (1)configure_file (2).cmake文件 (3) install (4)include_directories (5) add_subdirectory (6) find_libr…

FPGA秋招-笔记整理(3)无符号数、有符号数

参考:Verilog学习笔记——有符号数的乘法和加法 一、无符号数、有符号数 将输入输出全部定义为有符号数 (1)无符号数的读取按照原码进行,有符号数的读取应该按照补码读取,计算规则为去掉符号位后取反、加1在计算数值…

中国人工智能奠基人张钹院士:走进“无人区” 探索人工智能之路

4月23日,中国人工智能奠基人、清华大学计算机系教授、中国科学院院士张钹在“人文清华”讲坛作专题分享。在2小时的直播中,张钹以《走进“无人区” 探索人工智能之路》为主题,回顾人工智能的发展历程,为大家解读ChatGPT的意义&…

掺硼金刚石电极(BDD电极)电化学特性优异 全球市场将持续扩大

掺硼金刚石电极(BDD电极)电化学特性优异 全球市场将持续扩大 掺硼金刚石电极,简称BDD电极,是以掺硼金刚石(BDD)为材料制造而成的电极,即以金属或非金属材料为衬底,采用化学气相沉积法…

基于Springboot的web后端开发三层架构上手实操

引言 我们拿到了xml文件 我们要将将xml文件中的数据加载并解析 完成数据的处理 并且返回给前端页面(result格式) 1.将xml文件放在resources目录下 xml是我们需要解析的文件 查看xml文件 2.在springboot中引入dom4j依赖 解析xml需要在springboot中引入dom4j依赖 这边我们…

Thread类的基本用法

1.线程创建 这里介绍线程创建常用的五种方法 1.继承Thread,重写run class MyThread extends Thread{public void run(){//这里写的代码就是线程要完成的任务while (true){System.out.println("hello thread");try {Thread.sleep(1000);//线程会休眠一秒…

二维码门楼牌管理应用平台建设:取保候审人员管理的新模式

文章目录 前言一、取保候审人员管理的新挑战二、二维码门楼牌管理应用平台的引入三、平台的功能与应用四、优势与挑战五、结论 前言 随着科技的不断进步,二维码门楼牌管理应用平台已成为城市管理的创新手段。特别是在取保候审人员管理领域,这一技术的应…

电视盒子哪款好?实体店主盘点畅销电视盒子排名

电视盒子功能丰富,是升级电视机最具性价比的方案。我本人做实体数码店多年来,电视盒子是店内销量最好的产品之一,最近很多网友在讨论电视盒子哪款好,我整理了店内销量最好的电视盒子排名,想买电视盒子可以看看下面这几…

海外盲盒App开发:探索全球惊喜,开启无限可能

一、前言 随着全球化的深入发展,人们对于不同文化、不同地域的商品充满了好奇与向往。盲盒文化,作为一种充满神秘与惊喜的消费方式,正逐渐在全球范围内受到热烈追捧。为了满足海外用户对于盲盒的需求,我们团队精心策划并开发了一…

盲人安全过马路:科技赋能,独立出行不再难

作为一位资深记者,我长期关注特殊群体的生活现状与科技助力下的改善举措。今天,我要讲述的是盲人朋友在独立出行,尤其是过马路时面临的挑战,以及一款叫做蝙蝠避障的创新辅助应用如何通过实时避障与拍照识别功能,显著提…