設計mode

builder模式
場景:自定義組合控件需要很多配置參數、參數間存在順序、參數可選。如果只能通過傳參構造,那會存在十幾個參數,不方便閱讀和維護,如果通過set方法設置,又要注意調用順序、構造算法。使用builder模式,構建一個builder對象,set相應的參數,構建產品,對使用者隱匿複雜的構造過程。
特點:構建了一個多餘的實例,增加內存
實例:自己寫的viewpager,安卓原生的dialog

簡單工廠模式
場景:產品的構造需要頻繁變更,每次變更都會影響使用者。如果使用工廠模式,隔離直接構造。
特點:factory隔離了使用者和產品的構造,方便擴展和變更,但是新增產品時,需要改工廠中的代碼,增加if-else,違反了開閉原則;

工廠方法模式
場景:爲了解決簡單工廠中的開閉原則問題,每個新增一個產品就新增一個工廠,就不需要更改原有工廠了;
特點:如果某個產品由5個特性決定,改變1個特性就是一個新的產品,排列組合就有25個產品了,需要創建25個工廠,實際上好多工廠就只差一個特性,就要創建一個新的工廠;

抽象工廠模式
場景:一個產品由多個特性決定,該產品需要頻繁變更,或者由很多個變種,如果採用工廠方法,會創建很多工廠。把產品的每個特性抽象出來,對特性1創建多個factory,對特性2創建多個factory。。。最後,由一個產品factory組合這些特性factory,如果產品1和產品2之間只差一個特性,就只需要重寫那一個方法
特點:使用者只跟產品factory聯繫,產品factory只跟特性factory聯繫,一層層隔離

    // 產品是手機
    public interface Phone {}

    // soc由3個特性決定
    public interface Cpu{}
    public interface Ram{}
    public interface Rom{}

    public class Phone1Factory{
        private Cpu cpu;
        private Ram ram;
        private Rom rom;

        protected void createCpu(){
            // 使用cpuFacory1創建Cpu1
            // 使用cpuFacory2創建Cpu2
        }

        protected void createRam(){
            // 使用ramFactory1創建Ram1
            // 使用ramFactory2創建Ram2
        }

        protected void createRam(){
            // 使用romFactory1創建Rom1
            // 使用romFactory2創建Rom2
        }

        protected Phone createPhone(){
            // 根據上面創建的三個特性,構建soc
        }
    }

裝飾者模式
場景:一個產品由多個屬性,這些屬性是可選的,創建時是未知的,會隨着程序的運行動態改變的。跟builder模式、工廠模式的區別:
builder模式:產品創建後無法改變,只有一個產品,主要目的是隱藏、隔離複雜的創建過程;
工廠模式:產品創建後無法改變,有多個相似產品,主要目的是優雅地創建多個相似產品;
裝飾者模式:產品創建後可以改變,只有一個產品,主要目的是讓產品隨着程序運行而改變;

策略模式
特點/優勢:多變的業務邏輯,把變化的部分抽象成一個類,不同的子類有不同的實現
例子:對各種指令的處理,客戶A希望打開並播放,客戶B希望後臺播放。android中的setOnClickListener就是典型的策略模式。可以結合工廠模式,生產不同的策略;

狀態模式
特點/優勢:把某個業務邏輯抽成一個類(狀態),這個類定義一個run方法,每個子類對run方法的執行不一樣,跟策略模式看上去一樣
場景:策略模式是靜態的、初始化時就決定了,是調用者決定到底使用哪個策略。如果策略需要做成動態的、而且如何改變還依賴策略本身(比如,調用了策略A的run方法後,有可能需要把策略切換爲B),如果還是讓調用者決定到底使用哪個策略,調用者代碼就很難維護。狀態模式就是把策略下沉到具體產品中去,當調用了某個方法、發生了某個事情時,狀態切換到B,所有依賴狀態的方法都由策略B類實現,調用的也是策略B類的run方法;
例子:調用player的exit方法後,player狀態就變爲“退出狀態”了,某些方法的執行邏輯就會改變了

責任鏈模式
特點/優勢:一系列複雜的、鏈條比較長的業務邏輯,通過單一職責分配,每個類執行一部分,最後連起來執行一條複雜的業務邏輯
場景:一條指令下來,第一步是解析指令和參數,第二步是區分當前語音焦點、這個指令給誰處理,第三步是交給具體的proxy處理。android中的控件繪製,父控件繪製自己,確定子控件位置,通知子控件,子控件繪製自己

模版方法模式
一個接口可能會有很多個子類,每個子類的主體流程是固定的,但流程中的每一步實現又不一樣。。。。好吧,直接說吧,具是View和Activity這種,要按固定順序要調那幾個方法,但是每個方法的實現要放在子類實現

代理模式
一個解耦器,兩個不同的管道要對接,中間加個適配器,兩個管道都只跟適配器對接

中介模式
5個產品類,每個類的行爲、特點都受其它產品類的影響,改動一個產品,其它4個產品可能都要跟着改動。通過中介模式,所有產品的改動都通知中介,中介負責通知各個產品。就是事件總線,典型的如播放列表、本地音源、收藏列表、播放器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章