Android设计模式--策略模式

每天都要完成一个小目标

一,定义

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化

什么意思呢?在我们平时的开发中,难免会遇到这种情况,实现某一个功能会有多种算法,如果我们将这些算法都放到一个类里面,通过if else 来选择具体的算法,那么这个类就会变得臃肿,维护成本也会提高,后面如果再增加一种算法,就需要修改这个类本身,这违反了OCP原则和单一职责原则。

如果我们将这些算法抽象出来,提供一个统一的接口,不同的算法有不同的实现类,这样在程序客户端就可以通过注入不同的实现对象来实现算法的动态替换,这种方式可扩展性,维护性高,这就是策略模式。

二,使用场景

1,针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。

2,需要安全的封装多种同一类型的操作时。

3,出现同一抽象类有多个子类,而又需要使用if-else 或者switch case来选择具体子类时。

三,使用案例

假设有一个队列的排序功能,有三种算法,正序,倒序,随机排序。

如果不用策略模式,实现方式为:

先实现具体的策略类,根据不同的值采用不同的算法:

public class NormalStrategy {
    private static final String TAG = "NormalStrategy";

    public void order(String strategy){
        if(strategy.equals("order")){
            //正序算法
            Log.d(TAG,"1,2,3,4,5,6,7,8,9");
        }else if(strategy.equals("inorder")){
            //倒序算法
            Log.d(TAG,"9,8,7,6,5,4,3,2,1");
        }else {
            //随机数
            Log.d(TAG,"5,4,6,7,8,9,2,3,1");
        }
    }
}

具体应用:

NormalStrategy normalStrategy =new NormalStrategy();
normalStrategy.order("order");
normalStrategy.order("inorder");
normalStrategy.order("random");

输出:

如果我们 再增加一种排序算法,就需要修改策略类,比如,我们再增加一中算法,让1在第二位输出:

public class NormalStrategy {
    private static final String TAG = "NormalStrategy";

    public void order(String strategy){
        if(strategy.equals("order")){
            //正序算法
            Log.d(TAG,"1,2,3,4,5,6,7,8,9");
        }else if(strategy.equals("inorder")){
            //倒序算法
            Log.d(TAG,"9,8,7,6,5,4,3,2,1");
        }else if(strategy.equals("random")){
            //随机数
            Log.d(TAG,"5,4,6,7,8,9,2,3,1");
        }else {
            //让1在第二位输出
            Log.d(TAG,"2,1,3,4,5,6,7,8,9");
        }
    }
}

具体应用:

NormalStrategy normalStrategy =new NormalStrategy();
normalStrategy.order("order");
normalStrategy.order("inorder");
normalStrategy.order("random");
normalStrategy.order("new");

输出:

那下面我们使用策略模式来实现:

首先创建一个抽象的策略接口:

/**
 * 排序策略接口
 * */
public interface Strategy {

    void orderStrategy();
}

然后实现具体的策略类:

正序策略类

public class OrderStrategy implements Strategy{
    private static final String TAG = "OrderStrategy";
    @Override
    public void orderStrategy() {
        //正序算法
        Log.d(TAG,"1,2,3,4,5,6,7,8,9");
    }
}

倒序策略类

public class InOrderStrategy implements Strategy{
    private static final String TAG = "InOrderStrategy";
    @Override
    public void orderStrategy() {
        //倒序算法
        Log.d(TAG,"9,8,7,6,5,4,3,2,1");
    }
}

随机数策略类

public class RandomStrategy implements Strategy{
    private static final String TAG = "RandomStrategy";
    @Override
    public void orderStrategy() {
        //随机数算法
        Log.d(TAG,"5,4,6,7,8,9,2,3,1");
    }
}

策略类的中转上下文类

public class StrategyImp {
    private Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void order(){
        strategy.orderStrategy();
    }
}

具体的实现

StrategyImp strategyImp =new StrategyImp();
strategyImp.setStrategy(new OrderStrategy());
strategyImp.order();
strategyImp.setStrategy(new InOrderStrategy());
strategyImp.order();
strategyImp.setStrategy(new RandomStrategy());
strategyImp.order();

输出:

如果在增加一种排序算法的话,就不需要修改现有的代码,只需要新建一个类,实现策略接口即可。假如现在还要再增加一中排序算法,让1在第二位输出,那么实现为:

public class NewStrategy implements Strategy{
    private static final String TAG = "NewStrategy";
    @Override
    public void orderStrategy() {
        //让1在第二位输出
        Log.d(TAG,"2,1,3,4,5,6,7,8,9");
    }
}

至此,就完成了策略模式的封装。

四,总结

策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。

优点 :

1,结构清晰明了,使用简单直观

2,耦合度低,扩展性强

3,操作封装也更为彻底,数据更为安全

缺点 :

随着策略的增加,子类也会变得繁多

参考文献:Android源码设计模式第二版

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【eNSP安装与使用】华为eNSP网络设备模拟器从安装到使用详细步骤(亲测有效,附安装包下载)

目录 写在前面涉及知识一、安装那些事1.1前期安装包准备(基于windows10环境测试)1.2 安装WinPcap1.3 安装Wireshark1.4 安装VirtualBox1.5 安装eNSP 二、使用那些事2.1 安装问题解决(启动设备ar1失败 错误代码41)2.2 测试使用 三、…

干货分享---- 金融贷款电销获客的方法、渠道

电话营销的现状是,它过去使用电话资源在常规交易平台上正常工作,但进入时,对方总是挂断电话,甚至被他人标记为骚扰,这使工作变得困难。事实上,电话营销交易量飙升的关键很简单,那就是营销技巧和…

AGI+机器人行业:AGI 赋能人形机器人,具身智能时代有望加速到来

目录 1AGI的关键拼图:起于大模型,终于具身智能 .2 具身智能助力AGI走进现实 3人形机器人是AGI最佳载体,业界研究进展加速 2.2 OpenAI升级迭代GPT,推动机器人“大脑”升级 2.3 Meta与CMU联手打造RoboAgent,用更少的…

【开源】基于JAVA的生活废品回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案,旨在鼓…

网上赚钱有哪些项目可以长期做?盘点六个靠谱的副业项目

很多想扩宽收入来源,或者准备从事网络副业项目的人来说,在网上找到一个靠谱的项目也并非易事。现在的网络时代,网上赚钱成了一个备受关注的话题。但是现在却到处充斥着金钱和骗局的诱惑,不谨慎的朋友很容易被骗踩坑。 那么&#x…

一文搞懂Transformer

近期Transformer系列模型的出现,增加了CV领域的多样性。但是Transformer这一不同领域的模型对学习者来说需要一个细致的学习过程.下面就是本菜鸟总结学习路线。 Transformer是基于attention机制。而attention机制又在Encoder、Decode中。本篇博客将从Attention->…

软件测试如何定位判断是前端的bug还是后端bug

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

【漏洞复现】浙大恩特客户资源管理系统 fileupload.jsp 任意文件上传漏洞

文章目录 前言声明一、系统概述二、漏洞描述三、资产探测四、漏洞复现五、修复建议 前言 杭州恩软信息技术有限公司客户资源管理系统fileupload.jsp接口存在安全漏洞,攻击者可通过上传恶意脚本应用,获取服务器控制权限。 声明 请勿利用文章内的相关技术…

7个免费的优质图标素材网站,设计师必备!

对于交互设计师和产品经理来说,一套漂亮易用的图标可以算是提高效率的法宝,自己导出一套标准化的图标是一个巨大的工程。如何找到一个既美观又实用又能快速重用的图标?别慌,今天我们整理了7个价值高又好用的图标素材网站&#xff…

【unity插件】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件

文章目录 前言地址描述Demo 演示Installation 安装如何玩演示用法使用示例完结 前言 一般的shader无法直接使用在UI上,需要在shader中定义特定的面板参数,今天就来推荐github上大佬做的一套开源的一系列UGUI,Shader实现的特效——UIEffect 为…

代码随想录 Day46 动态规划14 LeetCode T392 判断子序列 T115 不同的子序列

LeetCode T392 判断子序列 题目链接:392. 判断子序列 - 力扣(LeetCode) 题目思路: 本题有两种思路,第一个思路是使用双指针,第二个思路是使用动态规划,结尾笔者会附上两种方法的代码. 1.双指针 首先我们谈双指针的思路,就是让两个指针分别指向s和t字符…

Linux指令(二)

🎠🎠🎠🎠🎠🎠🎠🎠🎠🎠🎠🎠🎠🎠🎠🎠 🎖️🎖️🎖️&a…

C++入门,详解类和对象(1)

类和对象 一,前言二,类的介绍2.1类的引入2.2类的定义 三,类访问限定符及其分装3.1访问限定符说明 四,类的作用域五,类的实例化六,类对象模型6.1类的存储方式6.2类的大小计算 七,this指针7.1this…

​Unity Vuforia 新手(图片识别)教程,后续整理 实体识别 详细流程

文章目录 前言一、Vuforia是什么?二、Unity导入Vuforia1.去Unity - Windows – Asset Store,搜vuforia engine,添加到我的资源2.打开package Manager,导入到工程中即可3.或者在vuforia engine官网下载的Unity包导入4.检查是否导入…

选择最适合你的接口测试工具:SoapUI、JMeter、Postman!

在软件开发的过程中,接口测试是确保系统正常运行的关键环节。为了有效地执行接口测试,选择适当的工具至关重要。在这篇文章中,我们将比较分析三种常见的接口测试工具:SoapUI、JMeter和Postman,以帮助你了解它们的优势和…

TSINGSEE青犀视频平台EasyCVR修改设备通道不生效是什么原因?该如何解决?

视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流&#…

黑马程序员微服务 第五天课程 分布式搜索引擎2

分布式搜索引擎02 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和Res…

智能导诊的开发技术有哪些?

智能导诊源码 智能导诊是医疗领域中一项重要的应用,它可以帮助医生和患者更快速、更准确地诊断疾病,提高医疗效率和精度。以下是智能导诊开发技术的几个方面: 1.数据收集整合 智能导诊系统需要收集大量的医疗数据,包括患者症状、病史、检查结…

Cesium 展示——绘制圆的几种方式(全面)

文章目录 需求分析1. 使用圆形几何体 椭圆(CircleGeometry):2. 使用多边形几何体 Polygon(PolygonGeometry):3. 使用自定义几何体(CustomGeometry):4. 使用线实体(polyline):其他需求 总结绘制圆的几种方式 分析 1. 使用圆形几何体 椭圆(CircleGeometry): …

OSS大文件分片上传

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、原理二、工具类二、注意事项总结 前言 最近做到项目中一个上传视频的功能,需要使用大文件分片上传,在网上找了一些资源借鉴&#xf…