溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android設(shè)計(jì)模式之策略模式怎么使用

發(fā)布時(shí)間:2023-03-15 10:55:16 來(lái)源:億速云 閱讀:107 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“Android設(shè)計(jì)模式之策略模式怎么使用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Android設(shè)計(jì)模式之策略模式怎么使用”吧!

    1、收到需求

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

    2、不使用策略模式

    需要在 AnimatedView 類中實(shí)現(xiàn)所有的動(dòng)畫(huà)效果

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

    調(diào)用如下,需要在 AnimatedView 對(duì)象中設(shè)置動(dòng)畫(huà)類型,然后調(diào)用 startAnimation 方法來(lái)開(kāi)始動(dòng)畫(huà):

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

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

    3、使用策略模式

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

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

    定義了一個(gè)應(yīng)用動(dòng)畫(huà)的策略

    interface AnimationStrategy {
        fun applyAnimation(view: View)
    }

    它只是一個(gè)接口,等待具體的動(dòng)畫(huà)實(shí)現(xiàn) ,而剛開(kāi)始的通過(guò)設(shè)置animationType,在onDraw中通過(guò)if來(lái)判斷的方式

    修改為了使用當(dāng)前的策略對(duì)象

    private var animationStrategy: AnimationStrategy? = null

    在onDraw中調(diào)用

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

    我們?cè)匐S便寫(xiě)幾個(gè)定義不同的策略實(shí)現(xiàn)類,這些實(shí)現(xiàn)類實(shí)現(xiàn)了 AnimationStrategy 接口,并且根據(jù)不同的需求,可以選擇不同的策略實(shí)現(xiàn)類來(lái)應(yīng)用不同的動(dòng)畫(huà)效果。

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

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

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

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

    整合起來(lái)

    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è)計(jì)模式,它允許在運(yùn)行時(shí)動(dòng)態(tài)地選擇算法或行為,從而使得算法或行為可以獨(dú)立于使用它們的客戶端而變化。在例子中動(dòng)畫(huà)的改變,并不需要修改AnimatedView

    通常由一個(gè)接口或抽象類和多個(gè)實(shí)現(xiàn)類組成??蛻舳送ㄟ^(guò)調(diào)用接口或抽象類中的方法來(lái)執(zhí)行算法或行為,而具體的實(shí)現(xiàn)則由策略實(shí)現(xiàn)類來(lái)完成。在例子中AnimationStrategy為接口,各個(gè)動(dòng)畫(huà)為實(shí)現(xiàn)類。AnimatedView通過(guò)animationStrategy?.applyAnimation(this)來(lái)執(zhí)行

    如此我們也可以看出

    • 一個(gè)類需要在運(yùn)行時(shí)根據(jù)不同的情況采用不同的算法或行為。

    • 一個(gè)類定義了許多行為,而且這些行為在類的方法中以多個(gè)條件語(yǔ)句的形式出現(xiàn),將這些行為“分解”到不同的策略類中,可以避免條件語(yǔ)句的復(fù)雜度。

    • 算法的使用頻率不高,可以把它們封裝到策略類中,從而避免讓整個(gè)系統(tǒng)變得臃腫。

    • 多個(gè)類只有在算法或行為上稍有不同的情況。

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

    到此,相信大家對(duì)“Android設(shè)計(jì)模式之策略模式怎么使用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI