中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android設計模式之策略模式怎么使用

發布時間:2023-03-15 10:55:16 來源:億速云 閱讀:118 作者:iii 欄目:開發技術

本篇內容主要講解“Android設計模式之策略模式怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Android設計模式之策略模式怎么使用”吧!

    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)來執行

    如此我們也可以看出

    • 一個類需要在運行時根據不同的情況采用不同的算法或行為。

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

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

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

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

    到此,相信大家對“Android設計模式之策略模式怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    上蔡县| 裕民县| 岑溪市| 神木县| 汽车| 海南省| 荣昌县| 宜黄县| 吕梁市| 涡阳县| 富宁县| 凤山市| 宁化县| 图木舒克市| 孟州市| 文登市| 昭通市| 台南县| 天津市| 开原市| 罗源县| 星座| 温宿县| 维西| 绥滨县| 东至县| 巴楚县| 沭阳县| 紫阳县| 灵璧县| 华池县| 铜陵市| 赞皇县| 青浦区| 綦江县| 藁城市| 彰化市| 玉山县| 赤峰市| 菏泽市| 县级市|