热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要介绍了Android编程设计模式之策略模式,结合实例形式详细分析了Android策略模式的概念、原理、实现方法及相关注意事项,需要的朋友可以参考下

本文实例讲述了Android编程设计模式之策略模式。分享给大家供大家参考,具体如下:

一、介绍

在软件开发中也常常遇到这样的情况:实现某一个功能可以有多种算法或者策略,我们根据实际情况选择不同的算法或者策略来完成该功能。例如,排序算法,可以使用插入排序、归并排序、冒泡排序等。

针对这种情况,一种常规的方法是将多种算法写在一个类中。例如,需要提供多种排序算法,可以将这些算法写到一个类中,每一个方法对应一个具体的排序算法:当然,也可以将这些排序算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来选择具体的算法。这两种实现方法我们都可以称为硬编码。然而,当很多个算法集中在一个类中时,这个类就会变得臃肿,这个类的维护成本会变高,在维护时也更容易引发错误。如果我们需要增加一种新的排序算法,需要修改封装算法类的源代码。这就明显违反了OCP原则和单一职责原则。

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

简单来说就是,通常如果一个问题有多个解决方案时,最简单的就是利用if-else或者switch-case方式根据不同的情景选择不同的解决方案,但是这样耦合性太高 、代码臃肿、难以维护等。这时就可以使用策略模式来解决。

二、定义

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

三、使用场景

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

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

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

四、策略模式的UML类图

UML类图:

Context:用来操作策略的上下文环境。

Stragety:策略的抽象。

ConcreteStrategyAConcreteStrategyB:具体的策略实现。

五、简单实现

需求:计算图书价格,初级会员没有折扣,中级会员打9折,高级会员打8折。如果一般写法,应该是if-else判断他是什么级别的会员,在计算相应的折扣。下面使用策略模式来进行实现。
抽象折扣类:

public interface MemberStrategy {
  /**
   * 计算图书的价格
   * @param booksPrice  图书的原价
   * @return  计算出打折后的价格
   */
  public double calcPrice(double booksPrice);
}

初级会员折扣类:

public class PrimaryMemberStrategy implements MemberStrategy{
  /**
   * 初级会员折扣
   */
  @Override
  public double calcPrice(double booksPrice) {
    System.out.println("对于初级会员的没有折扣");
    return booksPrice;
  }
}

中级会员折扣类:

public class IntermediateMemberStrategy implements MemberStrategy{
  /**
   * 中级会员折扣
   */
  @Override
  public double calcPrice(double booksPrice) {
    System.out.println("对于中级会员的折扣为10%");
    return booksPrice * 0.9;
  }
}

高级会员折扣类:

public class AdvancedMemberStrategy implements MemberStrategy{
  /**
   * 高级会员折扣
   */
  @Override
  public double calcPrice(double booksPrice) {
    System.out.println("对于高级会员的折扣为20%");
    return booksPrice * 0.8;
  }
}

价格类:

public class Price {
  //持有一个具体的策略对象
  private MemberStrategy strategy;
  /**
   * 构造函数,传入一个具体的策略对象
   * @param strategy  具体的策略对象
   */
  public Price(MemberStrategy strategy){
    this.strategy = strategy;
  }
  /**
   * 计算图书的价格
   * @param booksPrice  图书的原价
   * @return  计算出打折后的价格
   */
  public double quote(double booksPrice){
    return this.strategy.calcPrice(booksPrice);
  }
}

客户端:

public class Client {
  public static void main(String[] args) {
    //选择并创建需要使用的策略对象
    MemberStrategy strategy1 = new AdvancedMemberStrategy();
    //创建环境
    Price price = new Price(strategy1);
    //计算价格
    double quote = price.quote(300);
    System.out.println("图书的最终价格为:" + quote);
  }
}

结果:

对于高级会员的折扣为20%
图书的最终价格为:240.0

六、策略模式和工厂模式的区别

工厂模式 策略模式
创建型的设计模式 行为型的设计模式
关注对象创建 关注行为的选择
黑盒子(无需知道具体的实现过程) 白盒子(知道具体的实现过程)

七、Android源码中的策略模式实现

随着技术的发展,工程师们已经越来越重视用户体验、用户交互。因此,动画成了很多应用中必不可少的部分,一个简单的引导页面也要做成动画的效果,一个按钮的隐藏也需要加入淡入淡出的动画效果。动画的实现原理就是在短时间内快速的进行画面切换,这个切换频率需要达到人眼感觉不出卡顿,例如标准的电影是24帧/秒。在比较流畅时,Android上的动画能够达到60帧/秒,人眼基本看不出间隔,所以,在我们看到这个动画就非常流畅。

单纯是动画还不足以满足我们的需求,在动画执行的过程中,我们还需要一些动态效果,这有点类似于电影的慢镜头,有时候我们需要它慢一点,有时候需要快一点,这样动画也变得灵动起来。这些动态效果就是通过插值器(TimeInterpolator)实现的,我们只需要对Animation对象设置不同的插值器就可以实现不同的动态效果。

LinearInterpolator、AccelerateInterpolator、CycleInterpolator等实现Interpolator,通过getInterpolator(float input)获取当前的时间百分比,以此来计算动画的属性值。

八、总结

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

优点:

结构清晰明了、使用简单直观。

耦合度相对而言较低,扩展方便。

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

缺点:

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

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
author-avatar
pan0608
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有