欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

5分鐘學會Android設(shè)計模式之策略模式Strategy Pattern教程

 更新時間:2023年03月15日 09:47:39   作者:AlbertZein  
這篇文章主要為大家介紹了5分鐘學會Android設(shè)計模式之策略模式Strategy Pattern教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

5分鐘設(shè)計模式之策略模式(Strategy Pattern)

設(shè)計模式是軟件開發(fā)中的常用模式,但是實際上很多人只是了解其概念,而在實際開發(fā)中并不知道如何應(yīng)用。因此,我們可以結(jié)合實際開發(fā)案例來詳細講解策略模式。

如果您有任何疑問、對文章寫的不滿意、發(fā)現(xiàn)錯誤或者有更好的方法,歡迎在評論、私信或郵件中提出,非常感謝您的支持。??

1、收到需求

假設(shè)我們需要自定義的 View 類,它需要實現(xiàn)不同的動畫效果,包括平移、旋轉(zhuǎn)、縮放等等等等。我們可以使用策略模式來實現(xiàn)這個功能,使得每種動畫效果都對應(yīng)一個策略類。

2、不使用策略模式

需要在 AnimatedView 類中實現(xiàn)所有的動畫效果

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" -> {
                // 實現(xiàn)平移動畫
            }
            "rotate" -> {
                // 實現(xiàn)旋轉(zhuǎn)動畫
            }
            "scale" -> {
                // 實現(xiàn)縮放動畫
            }
            else -> {
                throw IllegalArgumentException("Invalid animation type")
            }
        }
        invalidate()
    }
}

調(diào)用如下,需要在 AnimatedView 對象中設(shè)置動畫類型,然后調(diào)用 startAnimation 方法來開始動畫:

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

在這種實現(xiàn)方式中,如果需要增加或修改動畫效果,我們需要修改 AnimatedView 類中的代碼,這樣會增加代碼的復(fù)雜度和維護成本。

3、使用策略模式

而使用策略模式,我們只需要增加或修改策略實現(xiàn)類即可,而不需要修改現(xiàn)有的代碼。因此,使用策略模式能夠更好地實現(xiàn)代碼的可擴展性和可維護性。

我們將動畫有多種實現(xiàn)方法(不同的行為)這些行為看成一個AnimationStrategy 策略接口

定義了一個應(yīng)用動畫的策略

interface AnimationStrategy {
    fun applyAnimation(view: View)
}

它只是一個接口,等待具體的動畫實現(xiàn) ,而剛開始的通過設(shè)置animationType,在onDraw中通過if來判斷的方式

修改為了使用當前的策略對象

private var animationStrategy: AnimationStrategy? = null

在onDraw中調(diào)用

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

我們再隨便寫幾個定義不同的策略實現(xiàn)類,這些實現(xiàn)類實現(xiàn)了 AnimationStrategy 接口,并且根據(jù)不同的需求,可以選擇不同的策略實現(xiàn)類來應(yīng)用不同的動畫效果。

class TranslateAnimationStrategy : AnimationStrategy {
    override fun applyAnimation(view: View) {
        // 實現(xiàn)平移動畫
    }
}
class RotateAnimationStrategy : AnimationStrategy {
    override fun applyAnimation(view: View) {
        // 實現(xiàn)旋轉(zhuǎn)動畫
    }
}
class ScaleAnimationStrategy : AnimationStrategy {
    override fun applyAnimation(view: View) {
        // 實現(xiàn)縮放動畫
    }
}

使用方法如下,根據(jù)不同的需求來選擇不同的策略實現(xiàn)類

animatedView.apply {
    animationStrategy = TranslateAnimationStrategy() // 執(zhí)行平移動畫
    //or
    animationStrategy = RotateAnimationStrategy() // 執(zhí)行旋轉(zhuǎn)動畫
    //or
    animationStrategy = ScaleAnimationStrategy()// 執(zhí)行縮放動畫
}

AnimationStrategy 接口作為一個統(tǒng)一的接口,可以使得不同的策略實現(xiàn)類可以被統(tǒng)一地使用,從而實現(xiàn)了代碼的解耦和可擴展性。

整合起來

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、小結(jié)

策略模式是一種行為型設(shè)計模式,它允許在運行時動態(tài)地選擇算法或行為,從而使得算法或行為可以獨立于使用它們的客戶端而變化。在例子中動畫的改變,并不需要修改AnimatedView

通常由一個接口或抽象類和多個實現(xiàn)類組成。客戶端通過調(diào)用接口或抽象類中的方法來執(zhí)行算法或行為,而具體的實現(xiàn)則由策略實現(xiàn)類來完成。在例子中AnimationStrategy為接口,各個動畫為實現(xiàn)類。AnimatedView通過animationStrategy?.applyAnimation(this)來執(zhí)行

如此我們也可以看出

  • 一個類需要在運行時根據(jù)不同的情況采用不同的算法或行為。
  • 一個類定義了許多行為,而且這些行為在類的方法中以多個條件語句的形式出現(xiàn),將這些行為“分解”到不同的策略類中,可以避免條件語句的復(fù)雜度。
  • 算法的使用頻率不高,可以把它們封裝到策略類中,從而避免讓整個系統(tǒng)變得臃腫。
  • 多個類只有在算法或行為上稍有不同的情況。

使用策略模式可以增加代碼的靈活性和可維護性,使得代碼更易于擴展和修改。不過可不要亂用,畢竟多了很多個類,不是嘛。

結(jié)尾

設(shè)計模式是一個非常廣泛的話題,很多設(shè)計模式又有極高的相似度,剛接觸很容易混淆,因此很難知道在什么情況下應(yīng)該使用哪種設(shè)計模式。我將盡力提供在開發(fā)過程中遇到的最小單元的設(shè)計模式案例。更好地理解何時以及如何使用設(shè)計模式。

以上就是5分鐘學會Android設(shè)計模式之策略模式Strategy Pattern教程的詳細內(nèi)容,更多關(guān)于Android策略模式Strategy Pattern的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論