Android设计模式之策略模式怎么使用

其他教程   发布日期:2023年08月28日   浏览次数:428

本篇内容主要讲解“Android设计模式之策略模式怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android设计模式之策略模式怎么使用”吧!

    1、收到需求

    假设我们需要自定义的 View 类,它需要实现不同的动画效果,包括平移、旋转、缩放等等等等。我们可以使用策略模式来实现这个功能,使得每种动画效果都对应一个策略类。

    2、不使用策略模式

    需要在

    1. AnimatedView
    类中实现所有的动画效果
    1. class AnimatedView @JvmOverloads constructor(
    2. context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
    3. ) : View(context, attrs, defStyleAttr) {
    4. var animationType: String = "translate"
    5. fun startAnimation() {
    6. when (animationType) {
    7. "translate" -> {
    8. // 实现平移动画
    9. }
    10. "rotate" -> {
    11. // 实现旋转动画
    12. }
    13. "scale" -> {
    14. // 实现缩放动画
    15. }
    16. else -> {
    17. throw IllegalArgumentException("Invalid animation type")
    18. }
    19. }
    20. invalidate()
    21. }
    22. }

    调用如下,需要在

    1. AnimatedView
    对象中设置动画类型,然后调用
    1. startAnimation
    方法来开始动画:
    1. animatedView.apply {
    2. animationType = "translate"
    3. }.startAnimation()
    4. animatedView().apply {
    5. animationType = "rotate"
    6. }.startAnimation()

    在这种实现方式中,如果需要增加或修改动画效果,我们需要修改

    1. AnimatedView
    类中的代码,这样会增加代码的复杂度和维护成本。

    3、使用策略模式

    而使用策略模式,我们只需要增加或修改策略实现类即可,而不需要修改现有的代码。因此,使用策略模式能够更好地实现代码的可扩展性和可维护性。

    我们将

    1. 动画
    有多种实现方法(不同的行为)这些行为看成一个
    1. AnimationStrategy
    策略接口

    定义了一个应用动画的策略

    1. interface AnimationStrategy {
    2. fun applyAnimation(view: View)
    3. }

    它只是一个接口,等待具体的动画实现 ,而刚开始的通过设置

    1. animationType
    ,在onDraw中通过if来判断的方式

    修改为了使用当前的策略对象

    1. private var animationStrategy: AnimationStrategy? = null

    在onDraw中调用

    1. override fun onDraw(canvas: Canvas?) {
    2. super.onDraw(canvas)
    3. if (animationStrategy != null) {
    4. animationStrategy!!.applyAnimation(this)
    5. }
    6. }

    我们再随便写几个定义不同的策略实现类,这些实现类实现了

    1. AnimationStrategy
    接口,并且根据不同的需求,可以选择不同的策略实现类来应用不同的动画效果。
    1. class TranslateAnimationStrategy : AnimationStrategy {
    2. override fun applyAnimation(view: View) {
    3. // 实现平移动画
    4. }
    5. }
    6. class RotateAnimationStrategy : AnimationStrategy {
    7. override fun applyAnimation(view: View) {
    8. // 实现旋转动画
    9. }
    10. }
    11. class ScaleAnimationStrategy : AnimationStrategy {
    12. override fun applyAnimation(view: View) {
    13. // 实现缩放动画
    14. }
    15. }

    使用方法如下,根据不同的需求来选择不同的策略实现类

    1. animatedView.apply {
    2. animationStrategy = TranslateAnimationStrategy() // 执行平移动画
    3. //or
    4. animationStrategy = RotateAnimationStrategy() // 执行旋转动画
    5. //or
    6. animationStrategy = ScaleAnimationStrategy()// 执行缩放动画
    7. }

    1. AnimationStrategy
    接口作为一个统一的接口,可以使得不同的策略实现类可以被统一地使用,从而实现了代码的解耦和可扩展性。

    整合起来

    1. class AnimatedView @JvmOverloads constructor(
    2. context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
    3. ) : View(context, attrs, defStyleAttr) {
    4. var animationStrategy: AnimationStrategy? = null
    5. set(value) {
    6. field = value
    7. invalidate()
    8. }
    9. override fun onDraw(canvas: Canvas?) {
    10. super.onDraw(canvas)
    11. animationStrategy?.applyAnimation(this)
    12. }
    13. }

    4、小结

    策略模式是一种行为型设计模式,它允许在运行时动态地选择算法或行为,从而使得算法或行为可以独立于使用它们的客户端而变化。在例子中动画的改变,并不需要修改

    1. AnimatedView

    通常由一个接口或抽象类和多个实现类组成。客户端通过调用接口或抽象类中的方法来执行算法或行为,而具体的实现则由策略实现类来完成。在例子中AnimationStrategy为接口,各个动画为实现类。

    1. AnimatedView
    通过
    1. animationStrategy?.applyAnimation(this)
    来执行

    如此我们也可以看出

    • 一个类需要在运行时根据不同的情况采用不同的算法或行为。

    • 一个类定义了许多行为,而且这些行为在类的方法中以多个条件语句的形式出现,将这些行为“分解”到不同的策略类中,可以避免条件语句的复杂度。

    • 算法的使用频率不高,可以把它们封装到策略类中,从而避免让整个系统变得臃肿。

    • 多个类只有在算法或行为上稍有不同的情况。

    使用策略模式可以增加代码的灵活性和可维护性,使得代码更易于扩展和修改。不过可不要乱用,毕竟多了很多个类,不是嘛。

    以上就是Android设计模式之策略模式怎么使用的详细内容,更多关于Android设计模式之策略模式怎么使用的资料请关注九品源码其它相关文章!