当前位置: 首页 > news >正文

23种设计模式-策略模式

 

策略模式是一种设计模式,它允许在运行时选择算法的行为。它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户端。在本文中,我们将深入探讨策略模式的概念和实际应用,并通过Java代码进行演示。

在策略模式中,有三个主要的参与者:Context(上下文)、Strategy(策略)和ConcreteStrategy(具体策略)。Context是使用某种策略的对象,它维护一个对Strategy对象的引用。Strategy是一个抽象类或接口,它定义了所有支持的算法的通用接口。ConcreteStrategy是实现了Strategy接口的具体类,它封装了具体的算法。

让我们通过下面的代码示例来演示策略模式的应用:

首先,我们定义了一个Strategy接口,其中包含了一个算法的方法:

public interface Strategy {int execute(int a, int b);
}

然后,我们定义了三个具体策略类,分别实现了不同的算法:

public class AddStrategy implements Strategy {public int execute(int a, int b) {return a + b;}
}public class SubtractStrategy implements Strategy {public int execute(int a, int b) {return a - b;}
}public class MultiplyStrategy implements Strategy {public int execute(int a, int b) {return a * b;}
}

接着,我们定义了一个上下文类Context,它包含一个对Strategy对象的引用,可以通过setStrategy方法来设置当前的策略:

public class Context {private Strategy strategy;public void setStrategy(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int a, int b) {return strategy.execute(a, b);}
}

最后,我们可以在客户端代码中使用策略模式,根据需要选择不同的算法:

public class Client {public static void main(String[] args) {Context context = new Context();// 使用加法策略context.setStrategy(new AddStrategy());int result = context.executeStrategy(10, 5);System.out.println("10 + 5 = " + result);// 使用减法策略context.setStrategy(new SubtractStrategy());result = context.executeStrategy(10, 5);System.out.println("10 - 5 = " + result);// 使用乘法策略context.setStrategy(new MultiplyStrategy());result = context.executeStrategy(10, 5);System.out.println("10 * 5 = " + result);}
}

以上代码示例演示了策略模式在Java中的基本实现。在实际的Android开发中,策略模式也有很多实际的应用。

在Android应用中,我们可以使用策略模式来动态地选择不同的算法,例如根据用户的行为和偏好来调整应用的推荐算法、根据不同的网络环境来选择最优的数据加载策略等等。

下面,我们将通过一个具体的例子来演示策略模式在Android开发中的实际应用。

假设我们正在开发一个在线购物应用,我们需要在不同的网络环境下选择最优的图片加载策略,以提供更好的用户体验。在WiFi环境下,我们可以使用高清图片;在移动数据网络环境下,我们应该使用压缩图片来节省流量和提高加载速度。

首先,我们定义一个策略接口,其中包含了一个加载图片的方法:

public interface ImageLoadStrategy {void loadImage(ImageView imageView, String url);
}

然后,我们定义两个具体策略类,分别实现了在WiFi和移动数据网络环境下的图片加载策略:

public class HighQualityImageLoadStrategy implements ImageLoadStrategy {public void loadImage(ImageView imageView, String url) {// 在WiFi环境下使用高清图片加载策略// 加载图片的代码}
}public class CompressedImageLoadStrategy implements ImageLoadStrategy {public void loadImage(ImageView imageView, String url) {// 在移动数据网络环境下使用压缩图片加载策略// 加载图片的代码}
}

接着,我们定义一个图片加载器类ImageLoader,它包含一个对ImageLoadStrategy对象的引用,可以根据当前网络环境自动选择最优的加载策略:

public class ImageLoader {private ImageLoadStrategy strategy;public void setStrategy(ImageLoadStrategy strategy) {this.strategy = strategy;}public void loadImage(ImageView imageView, String url) {ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {// 当前是WiFi环境,使用高清图片加载策略setStrategy(new HighQualityImageLoadStrategy());} else {// 当前是移动数据网络环境,使用压缩图片加载策略setStrategy(new CompressedImageLoadStrategy());}strategy.loadImage(imageView, url);}
}

最后,我们可以在Android应用中使用图片加载器ImageLoader,根据不同的网络环境选择最优的加载策略:

ImageLoader imageLoader = new ImageLoader();
imageLoader.loadImage(imageView, url);

通过以上代码示例,我们可以看到策略模式在Android开发中的实际应用。它可以帮助我们动态地选择不同的算法,以适应不同的环境和需求,从而提高应用的性能和用户体验。

总结:在本文中,我们介绍了策略模式的概念、优点和应用场景,并通过Java代码示例和Android开发中的实际应用来解释了策略模式的使用方法和原理。

策略模式是一种简单而有效的设计模式,它可以帮助我们将算法的实现与客户端的代码分离,提高代码的灵活性、可维护性和可扩展性。在Android开发中,策略模式可以帮助我们实现不同的算法选择、数据加载策略、UI交互等功能,从而提高应用的性能和用户体验。

希望本文可以帮助读者更好地理解策略模式,并在实际开发中运用这种设计模式。如果您有任何疑问或建议,欢迎在评论区留言,谢谢阅读!

 

相关文章:

23种设计模式-策略模式

策略模式是一种设计模式,它允许在运行时选择算法的行为。它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户端。在本文中,我们将深入探讨策略模式的概念和实际应用&#…...

C#开发的OpenRA的游戏主界面怎么样创建

通过前面加载界面布局数据,可以把整个界面逻辑的数据加载到内存, 但是这些数据怎么显示出来,又是没有定义的。比如前面定义了多个界面的布局, 又是怎么样知道需要显示哪一个界面? 现在就来解决这个问题,其实整个游戏都是可以通过yaml文件进行配置的, 所以我们需要从yaml…...

考研还是工作?两战失败老道有话说

老道入职第一周自我介绍谈谈考研谈谈工作新的启程自我介绍 大家好!在下是一枚考研失败两次的自认为聪明能干的有点小帅的实则超级垃圾的三非名校毕业的自动化渣男。大一下就加入实验室,在实验室焊板子、画板子、培训、打比赛外加摸鱼;参加过…...

引用是否有地址的讨论的

说在前头,纯属个人理解,关于引用是否有地址,实际上并没有一个很统一的说法, C标准没有规定一个引用是否需要占用一块内存。 这里引用知乎“C 中引用是一块内存的标记,那引用本身有地址吗_百度知道 (baidu.com)”里面的…...

1、JAVA 开发环境搭建 - JDK 的安装配置

文章目录一、下载 JDK81、官网地址:[**https://www.oracle.com**](https://www.oracle.com)二、安装 JDK1、鼠标右键安装包,以管理员身份运行(无脑下一步即可)2、细节说明三、配置环境变量1、为啥要配置环境变量呢?2、原因分析3、配置环境变量…...

【Storm】【六】Storm 集成 Redis 详解

Storm 集成 Redis 详解 一、简介二、集成案例三、storm-redis 实现原理四、自定义RedisBolt实现词频统计一、简介 Storm-Redis 提供了 Storm 与 Redis 的集成支持&#xff0c;你只需要引入对应的依赖即可使用&#xff1a; <dependency><groupId>org.apache.storm…...

算法代码题——模板

文章目录1. 双指针: 只有一个输入, 从两端开始遍历2. 双指针: 有两个输入, 两个都需要遍历完3. 滑动窗口4. 构建前缀和5. 高效的字符串构建6. 链表: 快慢指针7. 反转链表8. 找到符合确切条件的子数组数9. 单调递增栈10. 二叉树: DFS (递归)]11. 二叉树: DFS (迭代)12. 二叉树: …...

CentOS 7.9汇编语言版Hello World

先下载、编译nasm汇编器。NASM汇编器官网如下图所示&#xff1a; 可以点图中的List进入历史版本下载网址&#xff1a; 我这里下载的是nasm-2.15.05.tar.bz2 在CentOS 7中&#xff0c;使用 wget http://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2下载…...

CoreData数据库探索

CoreData是什么 Core Data 是苹果公司提供的一个对象-关系映射框架&#xff08;Object-Relational Mapping&#xff0c;ORM&#xff09;&#xff0c;用于管理应用程序的数据模型。Core Data 提供了一个抽象层&#xff0c;使开发人员能够使用面向对象的方式访问和操作数据&…...

FreeRTOS入门

目录 一、简介 二、堆的概念 三、栈的概念 四、从官方源码中精简出第一个FreeRTOS程序 五、修改官方源码增加串口打印 一、简介 FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统&#xff0c;功能包括&#xff1a;任务管理、时间管理、信号量、消息队列、…...

JVM运行时数据区划分

Java内存空间 内存是非常重要的系统资源&#xff0c;是硬盘和cpu的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略&#xff0c;保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机…...

重装系统一半电脑蓝屏如何解决

小编相信大家在使用电脑或者给电脑重装系统的时候都遇到过电脑蓝屏等等故障问题。最近有用户就遇到了这样一个问题&#xff0c;问小编重装系统一半电脑蓝屏怎么办&#xff0c;那么今天小编就告诉大家重装系统一半电脑蓝屏的解决方法。 工具/原料&#xff1a; 系统版本&#x…...

SpringBoot(tedu)——day01——环境搭建

SpringBoot(tedu)——day01——环境搭建 目录SpringBoot(tedu)——day01——环境搭建零、今日目标一、IDEA2021项目环境搭建1.1 通过 ctrl鼠标滚轮 实现字体大小缩放1.2 自动提示设置 去除大小写匹配1.3 设置参数方法自动提示1.4 设定字符集 要求都使用UTF-8编码1.5 设置自动编…...

springboot整合redis

1.redis的数据类型,一共有5种.后面结合Jedis和redistemplate,以及单元测试junit一起验证  1)字符串  2)hash  3)列表  4)set(无序集合)  5)zset(有序集合) 2.Jedis的使用  a)引入依赖 <!--加入springboot的starter的起步依赖--><dependency><groupId>…...

【Java】Spring Boot下的MVC

文章目录Spring MVC程序开发1. 什么是Spring MVC&#xff1f;1.1 MVC定义1.2 MVC 和 Spring MVC 的关系2. 为什么学习Spring MVC&#xff1f;3. 怎么学习Spring MVC&#xff1f;3.1 Spring MVC的创建和连接3.1.1 创建Spring MVC项目3.1.2 RequestMapping 注解介绍3.1.3 Request…...

【项目精选】 塞北村镇旅游网站设计(视频+论文+源码)

点击下载源码 摘要 城市旅游产业的日新月异影响着村镇旅游产业的发展变化。网络、电子科技的迅猛前进同样牵动着旅游产业的快速成长。随着人们消费理念的不断发展变化&#xff0c;越来越多的人开始注意精神文明的追求&#xff0c;而不仅仅只是在意物质消费的提高。塞北村镇旅游…...

十、Spring IoC注解式开发

1 声明Bean的注解 负责声明Bean的注解&#xff0c;常见的包括四个&#xff1a; ComponentControllerServiceRepository Controller、Service、Repository这三个注解都是Component注解的别名。 也就是说&#xff1a;这四个注解的功能都一样。用哪个都可以。 只是为了增强程序…...

Linux系统GPIO应用编程

目录应用层如何操控GPIOGPIO 应用编程之输出GPIO 应用编程之输入GPIO 应用编程之中断在开发板上测试GPIO 输出测试GPIO 输入测试GPIO 中断测试本章介绍应用层如何控制GPIO&#xff0c;譬如控制GPIO 输出高电平、或输出低电平。应用层如何操控GPIO 与LED 设备一样&#xff0c;G…...

手敲Mybatis-反射工具天花板

历时漫长的岁月&#xff0c;终于鼓起勇气继续研究Mybatis的反射工具类们&#xff0c;简直就是把反射玩出花&#xff0c;但是理解起来还是很有难度的&#xff0c;涉及的内容代码也颇多&#xff0c;所以花费时间也比较浩大&#xff0c;不过当了解套路每个类的功能也好&#xff0c…...

Java -数据结构,【优先级队列 / 堆】

一、二叉树的顺序存储 在前面我们已经讲了二叉树的链式存储&#xff0c;就是一棵树的左孩子和右孩子 而现在讲的是&#xff1a;顺序存储一棵二叉树。 1.1、存储方式 使用数组保存二叉树结构&#xff0c;方式即将二叉树用层序遍历方式放入数组中。 一般只适合表示完全二叉树&a…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...