文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

5分钟学会Android设计模式之策略模式StrategyPattern教程

2023-03-15 11:37

关注

5分钟设计模式之策略模式(Strategy Pattern)

设计模式是软件开发中的常用模式,但是实际上很多人只是了解其概念,而在实际开发中并不知道如何应用。因此,我们可以结合实际开发案例来详细讲解策略模式。

如果您有任何疑问、对文章写的不满意、发现错误或者有更好的方法,欢迎在评论、私信或邮件中提出,非常感谢您的支持。?

1、收到需求

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

2、不使用策略模式

需要在 AnimatedView 类中实现所有的动画效果

class AnimatedView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
    var animationType: String = "translate"
    fun startAnimation() {
        when (animationType) {
            "translate" -> {
                // 实现平移动画
            }
            "rotate" -> {
                // 实现旋转动画
            }
            "scale" -> {
                // 实现缩放动画
            }
            else -> {
                throw IllegalArgumentException("Invalid animation type")
            }
        }
        invalidate()
    }
}

调用如下,需要在 AnimatedView 对象中设置动画类型,然后调用 startAnimation 方法来开始动画:

animatedView.apply {
    animationType = "translate"
}.startAnimation()
animatedView().apply {
    animationType = "rotate"
}.startAnimation()

在这种实现方式中,如果需要增加或修改动画效果,我们需要修改 AnimatedView 类中的代码,这样会增加代码的复杂度和维护成本。

3、使用策略模式

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

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

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

interface AnimationStrategy {
    fun applyAnimation(view: View)
}

它只是一个接口,等待具体的动画实现 ,而刚开始的通过设置animationType,在onDraw中通过if来判断的方式

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

private var animationStrategy: AnimationStrategy? = null

在onDraw中调用

override fun onDraw(canvas: Canvas?) {
    super.onDraw(canvas)
    if (animationStrategy != null) {
        animationStrategy!!.applyAnimation(this)
    }
}

我们再随便写几个定义不同的策略实现类,这些实现类实现了 AnimationStrategy 接口,并且根据不同的需求,可以选择不同的策略实现类来应用不同的动画效果。

class TranslateAnimationStrategy : AnimationStrategy {
    override fun applyAnimation(view: View) {
        // 实现平移动画
    }
}
class RotateAnimationStrategy : AnimationStrategy {
    override fun applyAnimation(view: View) {
        // 实现旋转动画
    }
}
class ScaleAnimationStrategy : AnimationStrategy {
    override fun applyAnimation(view: View) {
        // 实现缩放动画
    }
}

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

animatedView.apply {
    animationStrategy = TranslateAnimationStrategy() // 执行平移动画
    //or
    animationStrategy = RotateAnimationStrategy() // 执行旋转动画
    //or
    animationStrategy = ScaleAnimationStrategy()// 执行缩放动画
}

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

整合起来

class AnimatedView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
    var animationStrategy: AnimationStrategy? = null
        set(value) {
            field = value
            invalidate()
        }
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        animationStrategy?.applyAnimation(this)
    }
}

4、小结

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

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

如此我们也可以看出

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

结尾

设计模式是一个非常广泛的话题,很多设计模式又有极高的相似度,刚接触很容易混淆,因此很难知道在什么情况下应该使用哪种设计模式。我将尽力提供在开发过程中遇到的最小单元的设计模式案例。更好地理解何时以及如何使用设计模式。

以上就是5分钟学会Android设计模式之策略模式Strategy Pattern教程的详细内容,更多关于Android策略模式Strategy Pattern的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯