5分钟学会Android设计模式之策略模式Strategy Pattern教程
作者:AlbertZein
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的资料请关注脚本之家其它相关文章!