Android设计模式详解之策略模式

news2025/7/19 17:12:48

前言

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

使用场景:

  • 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;
  • 需要安全地封装多种同一类型的操作时;
  • 出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时;

UML类图:
策略模式UML类图

实现示例

这里我们以乘坐不同的交通工具计算费用来举例:

  1. 乘坐地铁,6公里内(3元),6~12公里(4元),其他都算6元;
  2. 乘坐公交车,一条线路,上车都是3元;
  3. 乘坐Taxi,10公里内10元,超出每公里3元;

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

  • 首先,定义计算价格策略接口,IStrategy
interface IStrategy {
    fun calculatePrice(km: Int): Int
}
  • 公交车价格计算策略,BusStrategy;
class BusStrategy : IStrategy {
    override fun calculatePrice(km: Int): Int {
        return 3
    }
}
  • 地铁价格计算策略,SubwayStrategy;
class SubwayStrategy : IStrategy {
    override fun calculatePrice(km: Int): Int {
        if (km <= 6) {
            return 3
        }
        if (km <= 12) {
            return 4
        }
        return 6
    }
}
  • Taxi价格计算策略,TaxiStrategy;
class TaxiStrategy : IStrategy {
    override fun calculatePrice(km: Int): Int {
        if (km < 10) {
            return 10
        }
        return (km - 10) * 3 + 10
    }
}
  • 测试类;
object Test {

    @JvmStatic
    fun main(args: Array<String>) {
        //公交车计算
        val busStrategy = ContextStrategy(BusStrategy())
       println(busStrategy.calculatePrice(10))

        //Taxi计算
        val taxiStrategy = ContextStrategy(TaxiStrategy()) //只需要替换具体实现,满足里氏替换原则
        println(taxiStrategy.calculatePrice(10))
    }
}

Android源码中的策略模式

  • 动画Interpolator(差值器)
    我们分析下源码:我们常用的LinearInterpolator(线性差值器)AccelerateInterpolator(加速差值器)DecelerateInterpolator(减速差值器)继承BaseInterpolator,BaseInterpolator 实现Interpolator接口,而Interpolator又继承于TimeInterpolator接口,相关源码如下:
public class LinearInterpolator extends BaseInterpolator implements NativeInterpolator {
    public LinearInterpolator() {
    }
    public LinearInterpolator(Context context, AttributeSet attrs) {
    }

    public float getInterpolation(float input) {
        return input;
    }

    @Override
    public long createNativeInterpolator() {
        return NativeInterpolatorFactory.createLinearInterpolator();
    }
}
abstract public class BaseInterpolator implements Interpolator {
    private @Config int mChangingConfiguration;
    /**
     * @hide
     */
    public @Config int getChangingConfiguration() {
        return mChangingConfiguration;
    }

    /**
     * @hide
     */
    void setChangingConfiguration(@Config int changingConfiguration) {
        mChangingConfiguration = changingConfiguration;
    }
}

public interface Interpolator extends TimeInterpolator {
package android.animation;

public interface TimeInterpolator {

    float getInterpolation(float input);
}

我们在看下ValueAnimator中设置差值器以及调用getInterpolation方法的源码

public class ValueAnimator extends Animator implements AnimationHandler.AnimationFrameCallback {
 .....
    @Override
    public void setInterpolator(TimeInterpolator value) {
        if (value != null) {
            mInterpolator = value;
        } else {
            mInterpolator = new LinearInterpolator();
        }
    }
}
	获取差值器的值不断更新动画
    void animateValue(float fraction) {
        fraction = mInterpolator.getInterpolation(fraction);
        mCurrentFraction = fraction;
        int numValues = mValues.length;
        for (int i = 0; i < numValues; ++i) {
            mValues[i].calculateValue(fraction);
        }
        if (mUpdateListeners != null) {
            int numListeners = mUpdateListeners.size();
            for (int i = 0; i < numListeners; ++i) {
                mUpdateListeners.get(i).onAnimationUpdate(this);
            }
        }
    }
    ....

结合策略模式UML我们来整理下Interpolator相关的UML图:
Interpolator UML类图
是不是就是就是很典型的策略模式

总结

策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。
这个模式很好地演示了开闭原则,也就是定义抽象,注入不同的实现,而从达到很好的可扩展性。

优点:

  • 结构清晰明了、使用简单直观;
  • 耦合度较低,扩展方便;
  • 操作封装彻底,数据更为安全;

缺点:

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

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

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

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

相关文章

电磁波的达朗贝尔方程 工程电磁场P25

我们有下述两个方程 记住一定是线性介质 称为电磁波的达朗贝尔方程&#xff0c;是两个非齐次方程 我们下面介绍达朗贝尔方程的解 我们就用最简单的场源举例 这个方程可以写成 动态位是r和时间的函数 我们可以在球坐标系下展开成 我们再做一下变换 现在如果在这个微分方程里面…

智牛股_第7章_OAuth2+Spring Security OAuth2+GateWay+Druid+Spring Data JPA

交易平台 - Day 7 文章目录交易平台 - Day 7学习目标第1章 OAUTH2统一认证1. 目标2. 分析3. 讲解3.1 传统登陆认证3.2 单点登陆认证3.3 OAuth2简介3.4 OAuth2角色3.5 OAuth2 协议流程3.6 授权类型3.7 授权码模式流程3.8 简化模式3.9 密码模式3.10 客户端模式3.11 Spring Securi…

分治法算法

目录 一 算法简介 ①算法定义 ②算法特征 ③算法编程 二 算法应用 汉诺塔 问题描述 问题解析 问答解答 快速幂 问题描述 问题解析 问题解答 三 分治思想设计排序算法 步骤解析 归并排序 归并排序的主要操作 归并排序与交换排序 归并算法的应用&#xff1a;逆…

前端基础(十六)_BFC、box-shadow(盒子阴影)、text-shadow(文字阴影)

什么是BFC&#xff1f; 1、块级格式化上下文&#xff0c;web页面可视化css视觉渲染的一部分&#xff0c;是页面中一个独立的渲染区域&#xff1b; 2、用于决定块盒子的布局和浮动相互影响范围的一个区域&#xff0c;可以改变父级元素的渲染规则&#xff1b; 3、无论里面怎么折…

轻松入门基因表达式编程 (GEP)

0 引言 基因表达式编程 GEP (Gene Expression Programming) 是一种基于生物基因结构和功能发明的一种新型自适应演化算法。GEP 是从遗传算法&#xff08;geneticalgorithms ,简称 GAs&#xff09;和遗传程序设计&#xff08;genetic pro2gramming ,简称 GP&#xff09;中发展而…

Android GB∕T 19056-2021 汽车行驶记录仪-定位性能测试

最近在做汽车相关的项目&#xff0c;然后要根据最新发布的新国标接入&#xff0c;我们这边之前没有做过的&#xff0c;我是第一个&#xff0c;好惨啊。远程调试不通&#xff0c;后来还专门到现场进行了测试&#xff0c;来到刚刚转正没几天就开始出差了&#xff0c;命太苦了。 …

前沿系列--Transform架构[架构分析+代码实现]

文章目录前言总体架构总体任务使用输入部分EmbeddingPosition Encodingwhy实现注意部分注意力机制/自注意力掩码作用如何工作形状解释完整实现多头注意力实现Norm处理FeedForward 以及连接编码器解码器中间层组装输出层模型组装总结前言 Transform这玩意的大名我想就不用我多说…

2022年笔记本电脑市场总结:华为份额激增95%,联想、苹果均下滑

2022年即将过去&#xff0c;又来到了进行今年笔记本市场总结的环节。 今年笔记本电脑行业依然没有突破天花板。可以看到&#xff0c;2022年上半年期间市场还保持着良好的增长态势&#xff0c;到了下半年则出现了需求萎靡的状态。从一整年的数据来看&#xff0c;笔记本电脑行业还…

安装nnpy出现错误以及解决

今天在安装P4C的时候&#xff0c;参考了这篇博客 P4语言环境安装-前端编译器p4c、后端编译器p4c-bm2-ss、交换模型bmv2、Tutorial-张华Guido 在进行到这一步时&#xff0c;出现了错误 #安装python-pip sudo apt install python-pip #我是安装在/home/guido(user_name)/路径下…

阿里云斩获2022全球分布式云大会两项大奖

12 月 21日&#xff0c;“2022 全球分布式云大会深圳站”正式举办。阿里云弹性计算团队凭借在算力领域的创新突破与全面的分布式云产品矩阵布局&#xff0c;荣获“2022 年度中国算力先锋 TOP3”、“2022 年度分布式算力市场领导力企业”两项大奖。 图一&#xff1a;2022年度中国…

智能勘探 | AIRIOT智慧油田管理解决方案

石油勘探和开采地处偏远地区&#xff0c;涉及面广且生产规模大。特殊的作业环境下&#xff0c;使得工作人员作业条件艰苦&#xff0c;仅靠人工值守难度很大&#xff0c;不可避免的遇到一系列硬核挑战&#xff1a; 1、设备维护难度较高&#xff1b; 2、采油厂分布地域广、分散…

北面羽绒服成热议产品,小红书透露出哪些营销新趋势?

小红书浓厚的种草氛围&#xff0c;为品牌创造了良好的营销环境&#xff0c;想要在小红书做好内容种草&#xff0c;需要洞察用户的真实需求来推广产品&#xff0c;实现营销效果的最大化。那如何发现小红书上的热门品类&#xff1f;制定品牌营销策略&#xff1f;挑选优质合作达人…

面试题题review

面试题 已知一个几乎有序的数组&#xff0c;几乎有序是指&#xff0c;如果把数组排好顺序的话&#xff0c;每个元素移动的距离可以不超过k&#xff0c;并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。给定一个int数组A&#xff0c;同时给定A的大小…

多准则决策问题评估方法 | 层次分析法(含代码)

目前多准则决策问题的评估方法主要分为定性分析方法和定量分析方法两类。定性分析方法主要包括专家咨询、熵权法、案例研究和德尔菲法等&#xff1b;定量分析法主要包括层次分析法、主成分分析法、因子分析法、模糊综合评价法、色综合评价法以及数据包络分析法&#xff08;DEA法…

启科 QuSaaS 真随机数解决方案与 Amazon Braket 结合实践

作者&#xff1a;1.丘秉宜&#xff0c;2.邵伟&#xff0c;3.黄文&#xff0c;4.郭梦杰 1.亚马逊云科技 HERO&#xff1b;2.开发者生态负责人&#xff1b;3.DEVOPS 工程师&#xff1b;4.资深研发工程师 1、概述 随机性&#xff08;Randomness&#xff09;是偶然性的一种形式&…

【JavaEE】Tomcat

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录【Tomcat】&#xff1a;http服务器THINK努力成为你想成为的人一定很酷&#xff01; 【Tomcat】&#xff1a;http服务器 http客户端就是我们平时使用的浏览器&#xff0c;但是我们还需要开发实现一个服务器来搭建网…

[FireshellCTF2020]Caas

打开界面&#xff0c;是一个运行代码的*框&#xff0c;然后我们输入 本来以为会是一个ssti模板&#xff0c;{{8*8}}却仍然还是报错&#xff0c;print echo 等输出都不行 只能分析分析报错信息看看有没有什么有用的东西 /tmp目录下的&#xff0c;class_7eamm1tu3.c后缀名是c&…

【论文阅读】(2020)Knapsack polytopes: a survey(上)

文章目录一、Abstract 摘要二、Introduction 介绍三、General polyhedral structure 一般多面体结构3.1 Basic properties 基本性质3.2 Covers 覆盖不等式四、Binary formulations based on strong covers 基于强覆盖的二元公式五、Lifting 提升5.1 Sequential up-lifting5.2 S…

2. bean加载控制

1. Controller加载控制 因为功能不同&#xff0c;要避免Spring错误的加载到SpringMVC的bean 1.1 Controller加载控制与业务bean加载控制 SpringMVC相关bean&#xff08;表现层bean&#xff09; Spring控制的bean 业务bean&#xff08;Service&#xff09; 功能bean&#xf…

Java——图

概念 图是由顶点和边组成的一种数据结构&#xff0c;我们之前介绍的树形结构中&#xff0c;树的每一个节点就是顶点&#xff0c;顶点与顶点中的连线就是边&#xff0c;也就是说&#xff0c;树是一种特殊的图 图中的边如果有方向&#xff0c;那么这个图就称为有向图&#xff0…