`
yanghaoli
  • 浏览: 292271 次
社区版块
存档分类
最新评论

Android设计模式系列(11)

 
阅读更多

策略模式其实特别简单(听到这句话,大家是不是心里一下子放松了?)。
比如排序,官方告诉大家我这里有一个排序的接口ISort的sort()方法,然后民间各尽其能,实现这个排序的方法:冒泡,快速,堆等等。
这些方法就是“不同的策略”。
然后,某个模块下,需要一个排序方法,但是暂时不能指定具体的sort方法(出于扩展的考虑),就需要使用ISort接口了。
最后,具体什么场景下,传入什么具体的sort方法,实现灵活的排序。
这就是策略模式!
下面,我们分析Android中的动画是如何使用策略模式的。

1. 意图
定义一系列的算法,把它们一个个封装起来,并且使它们可互相替换。
策略模式使得算法可独立于使用它的客户而变化。

2. 结构图和代码
Animation不同动画的实现,主要是依靠Interpolator的不同实现而变。

定义接口Interpolator:

package android.animation;

/**
 * A time interpolator defines the rate of change of an animation. This allows animations
 * to have non-linear motion, such as acceleration and deceleration.
 */
public interface Interpolator {

    /**
     * Maps a value representing the elapsed fraction of an animation to a value that represents
     * the interpolated fraction. This interpolated value is then multiplied by the change in
     * value of an animation to derive the animated value at the current elapsed animation time.
     *
     * @param input A value between 0 and 1.0 indicating our current point
     *        in the animation where 0 represents the start and 1.0 represents
     *        the end
     * @return The interpolation value. This value can be more than 1.0 for
     *         interpolators which overshoot their targets, or less than 0 for
     *         interpolators that undershoot their targets.
     */
    float getInterpolation(float input);
}

我们以AccelerateInterpolator为例,实现具体的策略,代码如下:

package android.view.animation;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;

/**
 * An interpolator where the rate of change starts out slowly and
 * and then accelerates.
 *
 */
public class AccelerateInterpolator implements Interpolator {
    private final float mFactor;
    private final double mDoubleFactor;

    public AccelerateInterpolator() {
        mFactor = 1.0f;
        mDoubleFactor = 2.0;
    }

    /**
     * Constructor
     *
     * @param factor Degree to which the animation should be eased. Seting
     *        factor to 1.0f produces a y=x^2 parabola. Increasing factor above
     *        1.0f  exaggerates the ease-in effect (i.e., it starts even
     *        slower and ends evens faster)
     */
    public AccelerateInterpolator(float factor) {
        mFactor = factor;
        mDoubleFactor = 2 * mFactor;
    }

    public AccelerateInterpolator(Context context, AttributeSet attrs) {
        TypedArray a =
            context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.AccelerateInterpolator);

        mFactor = a.getFloat(com.android.internal.R.styleable.AccelerateInterpolator_factor, 1.0f);
        mDoubleFactor = 2 * mFactor;

        a.recycle();
    }

    public float getInterpolation(float input) {
        if (mFactor == 1.0f) {
            return input * input;
        } else {
            return (float)Math.pow(input, mDoubleFactor);
        }
    }
}

其他的Interpolator实现在此不列举了。
如何在Animation模块实现不同的动画呢?
在这里我想提一个应用很广的概念:依赖注入。
在Animation模块里实现不同的动画,就是需要我们把各个Interpolator以父类或者接口的形式注入进去。
注入的方法一般是构造函数,set方法,注释等等。
我们看看animation类是怎么做的:

public abstract class Animation implements Cloneable {
    Interpolator mInterpolator;
    // 通过set方法注入    
    public void setInterpolator(Interpolator i) {
         mInterpolator = i;
     }

    public boolean getTransformation(long currentTime, Transformation outTransformation) {
        // ... ...
        // 具体调用
        final float interpolatedTime = mInterpolator.getInterpolation(normalizedTime);
        applyTransformation(interpolatedTime, outTransformation);
       // ... ...
    }

     // 缺省实现,是个小技巧,顺便提下,这个不是重点
     protected void ensureInterpolator() {
         if (mInterpolator == null) {
             mInterpolator = new AccelerateDecelerateInterpolator();
         }
     }

}

策略模式其实就是多态的一个淋漓精致的体现。

3. 效果
(1).行为型模式
(2).消除了一些if...else...的条件语句
(3).客户可以对实现进行选择,但是客户必须要了解这个不同策略的实现(这句话好像是废话,总而言之,客户需要学习成本)
(4).代码注释中提到了缺省实现,可以让客户不了解策略,也能实现默认的策略
(5).注入的方式有多种:构造函数,set方法,注释。配置解析等等

0
5
分享到:
评论

相关推荐

    android常用设计模式

    Android 设计模式系列还包括工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式、适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式、解释器模式、模板方法模式、职责链模式、命令...

    android设计模式

    "android设计模式"这一主题,主要涵盖了一些常见的设计原则、模式以及如何在Android环境中应用它们。《设计模式之禅》作为一本经典著作,其深入浅出的讲解方式使得读者能够轻松掌握设计模式的核心理念。 1. **设计...

    android UI设计模式

    Android设计模式,尤其在Android 4.0版本之后,随着操作系统的功能完善,对于智能手机和平板电脑的计算能力有了显著的提升,使得开发者面临创建能够跨设备工作的用户界面的挑战,而设计模式提供了一系列的解决方案。...

    Android-23种设计模式

    在Android开发中,设计模式是提升代码质量和可维护性的重要工具。设计模式是对软件设计中常见问题的解决方案的模板,经过时间和实践的检验,能够帮助开发者有效地解决复杂性问题,提高代码的重用性和可扩展性。本...

    《Android源码设计模式解析与实战》PDF版本下载.txt

    根据提供的文件信息,我们可以推断出这是一本关于Android源码设计模式的书籍,并提供了PDF版本的下载链接。下面将围绕这本书籍所涉及的核心知识点进行详细的解析与介绍。 ### 设计模式简介 设计模式是在软件工程...

    设计模式之策略模式Android计算器实例

    在这个"设计模式之策略模式Android计算器实例"中,我们将探讨如何在Android应用中使用策略模式来实现一个计算器的功能。 首先,策略模式的核心思想是定义一系列算法,并将每个算法封装起来,使它们可以互相替换。...

    Java和Android源码设计模式

    ### Java和Android源码设计模式 #### 前言:迈向精通之路——设计模式的重要性 在软件开发领域,设计模式被视为提升代码质量和可维护性的关键工具。本文将深入探讨Java和Android开发中常用的设计模式,并结合实际...

    android 24种设计模式介绍与6大设计原则

    在Android开发中,设计模式和设计原则是提升代码质量、可维护性和可扩展性的重要工具。以下是关于"Android 24种设计模式介绍与6大设计原则"的详细阐述: 一、六大设计原则 1. **单一职责原则(Single ...

    android应用开发设计模式之-策略模式

    在Android应用开发中,设计模式是一种重要的编程范式,它为解决特定问题提供了标准的解决方案。今天我们将深入探讨其中的一种——策略模式。策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java...

    Android源码设计模式解析与实战 pdf 高清完整版

    《Android源码设计模式解析与实战》是一本深入探讨Android系统源码中设计模式应用的专业书籍,高清且完整。这本书旨在帮助开发者理解Android系统背后的架构原理,提升代码质量和可维护性,通过实战案例来加深对设计...

    Java和Android设计模式

    ### Java和Android设计模式 #### 设计模式概览 设计模式是软件开发中解决常见问题的一种标准化解决方案。在Java及Android开发中,合理运用设计模式能够显著提高代码质量,增强程序的灵活性、可扩展性和可维护性。...

    Android-用Kotlin实现设计模式代码

    本主题将探讨如何利用Kotlin实现常见的设计模式,这些模式对于构建可维护、可扩展和灵活的Android应用程序至关重要。 1. **单例模式(Singleton)**:在Android中,单例模式常用于创建全局唯一实例,例如网络请求管理...

    Android 常用设计模式

    在Android开发中,设计模式是不可或缺的工具,它们提供了应对特定设计挑战的标准化方法,能够提升代码质量和可维护性。本文将深入探讨Android开发者常用的三种设计模式:单例模式、工厂模式和构建器模式。 首先,...

    Android中设计模式探索.zip

    本压缩包中的“AndroidDpCode-master”文件是关于Android设计模式探索的一个代码库。它可能包含了上述各种设计模式的实现示例,帮助开发者更好地理解和应用这些模式到实际项目中去。这些代码示例不仅有助于巩固设计...

    Android 设计模式MVC+MVP 视频资源

    "1、开篇.avi"很可能是介绍整个系列的开篇,讲解了为什么需要这两种设计模式以及它们在Android开发中的重要性。 学习和熟练运用MVC和MVP设计模式对于提升Android开发能力至关重要,它们能帮助开发者写出更清晰、更...

    两篇android设计模式[归纳].pdf

    设计模式是软件开发中的一种最佳实践,它们是为了解决特定问题而形成的一系列经过验证的解决方案。在Android开发中,设计模式尤其重要,因为它们帮助我们创建可维护、可扩展和高效的应用程序。本文将重点讨论在...

    Android设计模式系列(2)--SDK源码之观察者模式.pdf

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察者”对象。在Android SDK源码中,观察者模式被广泛应用于对象间的通信,例如数据变更时的通知...

    android 中常用的开发设计模式

    在Android开发中,设计模式是提升代码质量和可维护性的重要工具。...文件"Java23种设计模式(总结).doc"和"android设计模式.docx"可能包含更详细的设计模式介绍和Android中的具体应用案例,建议详细阅读以深化理解。

    Android设计模式

    Android设计模式是面向对象编程在Android开发中的应用,它源于《设计模式:可复用面向对象软件的基础》一书中的理论,并在Android SDK源码中得到了广泛应用。设计模式是为了解决软件工程中常见问题而提出的成熟解决...

    Android设计模式系列之工厂方法模式

    此外,Android SDK源码中也有许多策略模式、适配器模式、单例模式等设计模式的应用。 6. **总结** 工厂方法模式在Android开发中扮演着重要的角色,它提供了一种灵活的方式来创建对象,同时保持了代码的解耦和可...

Global site tag (gtag.js) - Google Analytics