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

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

一、介绍

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

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

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

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

二、定义

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

三、使用场景

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

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

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

四、策略模式的UML类图

UML类图:

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

Stragety:策略的抽象。

ConcreteStrategyA、ConcreteStrategyB:具体的策略实现。

五、简单实现

需求:计算图书价格,初级会员没有折扣,中级会员打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程序设计有所帮助。

(0)

相关推荐

  • Android编程设计模式之抽象工厂模式详解

    本文实例讲述了Android编程设计模式之抽象工厂模式.分享给大家供大家参考,具体如下: 一.介绍 抽象工厂模式(Abstract Factory Pattern),也是创建型设计模式之一.前一节我们已经了解了工厂方法模式,那么这个抽象工厂又是怎么一回事呢?大家联想一下现实生活中的工厂肯定都是具体的,也就是说每个工厂都会生产某一种具体的产品,那么抽象工厂意味着生产出来的产品是不确定的,那这岂不是很奇怪?抽象工厂模式起源于以前对不同操作系统的图形化解决方案,如不同操作系统中的按钮和文本框控件其实现

  • Android编程设计模式之单例模式实例详解

    本文实例讲述了Android编程设计模式之单例模式.分享给大家供大家参考,具体如下: 一.介绍 单例模式是应用最广的模式之一,也可能是很多初级工程师唯一会使用的设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为. 二.定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 三.使用场景 确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个.例

  • Android编程设计模式之原型模式实例详解

    本文实例讲述了Android编程设计模式之原型模式.分享给大家供大家参考,具体如下: 一.介绍 原型模式是一个创建型的模式.原型二字表明了该模型应该有一个样板实例,用户从这个样板对象中复制出一个内部属性一致的对象,这个过程也就是我们俗称的"克隆".被复制的实例就是我们所称的"原型",这个原型也是可定制的.原型模型多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效. 二.定义 用原型实例指定创建对象的种类,并通过拷贝这些原型创

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

    策略模式 一个功能的效果,有不同的算法与策略,根据不同的选择选择不同的结果. 简单来说,只要你写过程序就用过策略模式,不要说没用过,难道if-else(switch)没用过吗-.. if-else在其实就是一个策略模式的体现,根据不同的选择处理不同的结果. 问题 如果把所有的方法全部用if-else(switch)来处理,从功能上说没问题,但是冲代码层面的维护与使用来说,if-else多了之后会让类变的过于庞大,阅读不利,修改困难 解决问题 使用策略模式,定义统一接口,每一个不同的功能(if-e

  • Android设计模式系列之组合模式

    Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类. 组合模式,Composite Pattern,是一个非常巧妙的模式.几乎所有的面向对象系统都应用到了组合模式. 1.意图 将对象View和ViewGroup组合成树形结构以表示"部分-整体"的层次结构(View可以做为ViewGroup的一部分). 组合模式使得用户对单个对象View和组合对象ViewGrou

  • Android编程设计模式之工厂方法模式实例详解

    本文实例讲述了Android编程设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 一.介绍 工厂方法模式(Factory Pattern),是创建型设计模式之一.工厂方法模式是一种结构简单的模式,其在我们平时开发中应用很广泛,也许你并不知道,但是你已经使用了无数次该模式了,如Android中的Activity里的各个生命周期方法,以onCreate方法为例,它就可以看作是一个工厂方法,我们在其中可以构造我们的View并通过setContentView返回给framework处理等,相关内

  • Android编程设计模式之状态模式详解

    本文实例讲述了Android编程设计模式之状态模式.分享给大家供大家参考,具体如下: 一.介绍 状态模式中的行为是由状态来决定的,不同的状态下有不同的行为.状态模式和策略模式的结构几乎完全一样,但它们的目的.本质却完全不一样.状态模式的行为是平行的.不可替换的,策略模式的行为是彼此独立.可相互替换的.用一句话来表述,状态模式把对象的行为包装在不同的状态对象里,每一个状态对象都有一个共同的抽象状态基类.状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变. 二.定义 当一个对象的内在

  • Android编程设计模式之观察者模式实例详解

    本文实例讲述了Android编程设计模式之观察者模式.分享给大家供大家参考,具体如下: 一.介绍 观察者模式是一个使用率非常高的模式,它最常用的地方是GUI系统.订阅--发布系统.因为这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得它们之间的依赖性更小,甚至做到毫无依赖.以GUI系统来说,应用的UI具有易变性,尤其是前期随着业务的改变或者产品的需求修改,应用界面也会经常性变化,但是业务逻辑基本变化不大,此时,GUI系统需要一套机制来应对这种情况,使得UI层与具体的业务逻辑解耦,观察者

  • Android编程设计模式之Builder模式实例详解

    本文实例讲述了Android编程设计模式之Builder模式.分享给大家供大家参考,具体如下: 一.介绍 Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程.该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来. 因为一个复杂的对象有很多大量组成部分,例如车,有车轮.方向盘.发动机,还有各种小零件等,如何将这些部件装配成一辆汽车,这个装配过程很漫长,也很复杂,对于这种情况,为了在构建过程中对

  • android设计模式之单例模式详解

    这是我们最常见的一类模式,对这一类模式有一个通用的特点就是: 封装创建的方式和过程. 这里所谓封装就是隐藏的意思,对对象的创建方法和过程不可见,或者是虚拟的过程. 隐藏创建方式,就是如单例,工厂方法,隐藏创建过程则是指builder,原型,至于抽象工厂,我认为他包含了以上两种. 我们想想一个对象的创建有哪些步骤? 1.创建什么东西?--接口定义 2.谁创建?        --决策类or帮助类 3.如何创建?     --how,创建过程 4.什么时候创建?    --创建时机的触发 由此可知,

随机推荐