Android 23種設(shè)計(jì)模式

Android 23種設(shè)計(jì)模式

1、Android 單例模式
2、Android Builder模式
3、Android 原形模式(深淺拷貝)
4、Android 工廠模式
5、Android 策略模式
6、Android 狀態(tài)模式
7、Android 責(zé)任鏈模式
8、Android 命令模式
9、Android 觀察者模式
10、Android 備忘錄模式
11、Android 迭代器模式
12、Android 模板方法模式
13、Android 訪問者模式
14、Android 中介者模式
15、Android 代理模式
16、Android 組合模式(View與ViewGroup)
17、Android 適配器模式(ListView與Adapter)
18、Android 裝飾者模式
19、Android 享元模式
20、Android 外觀模式
21、Android 橋接模式

停止更新...
以上工廠模式其實(shí)是兩種設(shè)計(jì)模式。包含工廠模式和抽象工廠模式,缺少“解釋器模式”由于這種模式極少運(yùn)用,多用于語言的文法。所以這里不做詳述。

設(shè)計(jì)模式的六大原則:
總原則:開閉原則,即對擴(kuò)展開放,對修改關(guān)閉。
1 單一職責(zé)原則:每個(gè)類應(yīng)該實(shí)現(xiàn)單一的職責(zé),否則應(yīng)該把類拆分。
2 里氏替換原則:任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。它是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換掉基類,軟件單位的功能不受影響時(shí),基類才能真正被復(fù)用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。
3 依賴倒轉(zhuǎn)原則:這是開閉原則的基礎(chǔ),對接口編程,依賴于抽象而不依賴于具體。
4 接口隔離原則:使用多個(gè)隔離的接口,比使用單個(gè)接口要好。每個(gè)接口不存在子類用不到卻必須實(shí)現(xiàn)的方法,否則要將接口拆分。
5 迪米特法則(最少知道原則):一個(gè)實(shí)體應(yīng)當(dāng)盡量少的與其他實(shí)體之間發(fā)生相互作用,使得系統(tǒng)的功能模塊相對獨(dú)立。
6 合成復(fù)用原則:盡量使用合成/聚合方式,而不是使用繼承。

本文以下都是總結(jié)設(shè)計(jì)模式核心思想和代碼結(jié)構(gòu)要點(diǎn)。幫助讀者記憶。閱讀前建議先閱讀鏈接里面的具體講解,理解設(shè)計(jì)模式本身再記憶

23中設(shè)計(jì)模式分類:
創(chuàng)建型模式:工廠方法模式 抽象工廠模式 單例模式 建造者模式 原型模式 (簡單工廠模式)
結(jié)構(gòu)型模式:代理模式 裝飾器模式 適配器模式 外觀模式 組合模式 享元模式 橋接模式
行為型模式:觀察者模式 責(zé)任鏈模式 模板方法模式 策略模式 迭代子模式 命令模式 狀態(tài)模式 備忘錄模式 訪問者模式 中介者模式 解釋器模式

溫故而知新可以為師矣

理解很重要,記住更重要,以下是總結(jié)各個(gè)模式知識(shí)點(diǎn)記憶要點(diǎn)。推薦配合代碼記憶。

-------------------創(chuàng)建型模式------------------

1、Android 單例模式

1、一共五種方案。核心就是私有構(gòu)造方法,使得創(chuàng)建的實(shí)例只有一個(gè)。以后都復(fù)用這個(gè)實(shí)例。
2、推薦使用帶有synchronized線程保護(hù)的DCL方式,和靜態(tài)內(nèi)部類static final變量定義類的方式

// DLC
public class SingletionDLC {
    private volatile static SingletionDLC mInstance;
    private SingletionDLC() {}
    public static SingletionDLC getmInstance() {
        if (mInstance == null) {
            synchronized (SingletionDLC.class) {
                if (mInstance == null) {
                    mInstance = new SingletionDLC();
                }
            }
        }
        return mInstance;
    }
}
// 靜態(tài)內(nèi)部類
public class SingletionInternalClass {
    private SingletionInternalClass() {}
    public static SingletionInternalClass getInstance() {
        return SingletionInternalClassHolder.instance;
    }

    private static class SingletionInternalClassHolder {
        private static final SingletionInternalClass instance = new SingletionInternalClass();
    }
}

2、Android Builder模式

外部類私有構(gòu)造方法帶參數(shù)Buidler(靜態(tài)內(nèi)部類),Builder定義build方法創(chuàng)建外部類。

public class Person  {
    private int ID;
    private Person(Builder builder) {
        this.ID = builder.ID;
    }
    public static class Builder {
        private int ID;
        public Builder setID(int ID) {
            this.ID = ID;
            return this;
        }
        public Person build() {
            return new Person(this);
        }
    }
}

Person.Builder buider = new Person.Builder();
buider.setAge(13);
buider.setName("jack");
Person jack = buider.build();

3、Android 原型模式

1、原型模式就是一個(gè)拷貝。
2、實(shí)現(xiàn)implements Cloneable的clone方法,來提供類可以clone。
3、int string這種是值類型,類的對象叫引用類型。
4、數(shù)值拷貝沒有深淺拷貝之分,注意引用變量拷貝,如果沒有再次加clone方法,默認(rèn)是淺拷貝。淺拷貝:獲得變量本身,深拷貝:獲得一個(gè)新的一模一樣的變量。

4、Android 工廠模式

1、工廠模式分為普通工廠模式、抽象工廠模式。
2、普通工廠模式產(chǎn)品用抽象類定義,抽象工廠的產(chǎn)品用接口定義。區(qū)別在于生產(chǎn)的產(chǎn)品上。普通工廠創(chuàng)建的都是具體的產(chǎn)品。而抽象工廠創(chuàng)建的時(shí)接口。因?yàn)榻涌谑浅橄蟪鰜淼摹K越谐橄蠊S。
3、工廠代碼結(jié)構(gòu)要點(diǎn):
普通工廠

public class NokiaFactory extends Factory {
    @Override
    public <T extends NokiaPhone> T createNokia(Class<T> clz) {
        NokiaPhone nokiaPhone = null;
        try {
            nokiaPhone = (NokiaPhone) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return (T) nokiaPhone;
    }
}

這里用的反射,你可以if else一個(gè)一個(gè)判斷來寫。或者一個(gè)產(chǎn)品對應(yīng)一個(gè)工廠。都是可以的。根據(jù)需求變化。
抽象工廠

public abstract class Factory {
    public abstract component.CPU createCPU();
    public abstract component.Battery createBattery();
}

public class IPhone6Factory extends Factory {
    @Override
    public component.CPU createCPU() {
        return new A9();
    }

    @Override
    public component.Battery createBattery() {
        return new Battery1000ma();
    }
}

抽象工廠就是生產(chǎn)接口。因?yàn)轭惱^承接口就擁有接口的特性。所以我們稱這種生產(chǎn)接口的工廠模式為抽象的工廠模式。當(dāng)然工廠類跟普通工廠一樣。可以自己根據(jù)需求隨意變化。

-------------------行為型模式------------------

5、Android 策略模式

策略模式側(cè)重于提供不同的策略
1、假設(shè)我們現(xiàn)在對一個(gè)數(shù)組從小到大排序,這個(gè)時(shí)候我們寫了兩個(gè)策略,都繼承自同一接口。實(shí)現(xiàn)時(shí)一個(gè)冒泡排序,一個(gè)插入排序。兩個(gè)策略。結(jié)果都能正常排序。所以策略模式的重點(diǎn)是不同的策略上。

6、Android 狀態(tài)模式

根據(jù)狀態(tài)的不同,提供不同的行為。
1、以下Monday就是一個(gè)狀態(tài)。這個(gè)狀態(tài)下,limit有自己的實(shí)現(xiàn)。

public class Monday implements Check {
    @Override
    public boolean limit(int lastNumber) {
        if (lastNumber == 1 || lastNumber == 6) {
            return true;
        }
        return false;
    }
}

limitLine.setCheck(monday);
boolean mondayLimitOne = limitLine.getLimitLine(1);
boolean mondayLimitTwo = limitLine.getLimitLine(2);
limitLine.setCheck(tuesday);
boolean tuesdayLimitOne = limitLine.getLimitLine(1);
boolean tuesdayLimitTwo = limitLine.getLimitLine(2);

7、Android 責(zé)任鏈模式

鏈?zhǔn)浇Y(jié)構(gòu)處理,A判斷是否處理,如果處理請求終止,如果不處理傳遞給B,這樣一直傳遞。形成鏈?zhǔn)浇Y(jié)構(gòu)
1、代碼結(jié)構(gòu)。類擁有一個(gè)next對象。根據(jù)自己的條件判斷是否調(diào)用到next。看如下抽象類。

abstract class Leader {
    static final String TAG = Leader.class.getSimpleName();
    public Leader nextLeader; // 上一級領(lǐng)導(dǎo)
    public final void handleLeave(StaffRequestLeave staff) {
        if (staff.getDays() <= getHandleLeaveDays()) {
            handle(staff);
        } else {
            if (nextLeader != null) {
                Log.d("Leader", "不處理,流轉(zhuǎn)");
                nextLeader.handleLeave(staff);
            } else {
                refuseRequest();
            }
        }
    }

    abstract int getHandleLeaveDays(); // 批準(zhǔn)請假天數(shù)
    abstract void handle(StaffRequestLeave staff); // 處理請假
    abstract void refuseRequest(); // 拒絕請假
}

8、Android 命令模式

“行為請求者”與“行為實(shí)現(xiàn)者”解耦。多個(gè)命令與行為一一對應(yīng)。
代碼結(jié)構(gòu)記憶如下:

public interface Command {
    void execute();
}

public class LeftCommand implements Command {
    private Television tv;

    public LeftCommand(Television tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.leftVolumeeduction();
    }
}

1、具體的功能實(shí)現(xiàn)在Television里面。相當(dāng)于用接口Command獲得tv實(shí)例封裝了一下。這樣客戶端調(diào)用就是lfteCommand.execute();不關(guān)注具體實(shí)現(xiàn)。

9、Android 觀察者模式

一個(gè)list合集,提供add,remove遍歷觀察者,在調(diào)用具體方法的時(shí)候遍歷list里的觀察者,并調(diào)用觀察者的方法

@Override
    public void sun() {
        for (WeatherOberver observerListener : list) {
            observerListener.sun();
        }
    }

10、Android 備忘錄模式

用單獨(dú)的類來保存和讀取狀態(tài)。避免直接訪問數(shù)據(jù)和內(nèi)部實(shí)現(xiàn)。
1、比如MP3,單獨(dú)寫一個(gè)類來保存歌名,播放百分比。退出則保存這些數(shù)據(jù)。再次進(jìn)入就讀取這些狀態(tài)。

11、Android 迭代器模式

根據(jù)傳入的list額外提供一個(gè)遍歷方法。
1、迭代器實(shí)現(xiàn)如下

public class IteratorImpl<T> implements Iterator<T> {
    private List<T> list = new ArrayList<T>();
    private int cursor = 0;

    public IteratorImpl(List<T> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return cursor != list.size();
    }

    @Override
    public T next() {
        T obj = null;
        if (this.hasNext()) {
            obj = this.list.get(cursor++);
        }
        return obj;
    }
}

1、通常一個(gè)容器就是一個(gè)普通的list除開add remove基礎(chǔ)方法。
2、除開list之外再擁有一個(gè)IteratorImpl<T>對象。
容器擁有迭代器的核心代碼:

@Override
    public Iterator<T> iterator() {
        return new IteratorImpl<>(list);
    }

調(diào)用如下:

Iterator<String> iterator = containerImpl.iterator();
// 迭代器提供遍歷方法,遍歷
while (iterator.hasNext()) {
    Log.d("Iterator",iterator.next());
}

12、Android 模板方法模式

流程封裝,父類封裝不可變方法。子類實(shí)現(xiàn)部分或全部可擴(kuò)展方法。
1、代碼結(jié)構(gòu)。直接記Activity中的onCreate,onResume就是模板方法模式。

13、Android 訪問者模式

1、被訪問者不變。
2、根據(jù)訪問者和被訪問者的不同,兩兩對應(yīng)達(dá)到不同的目的。
3、遍歷被訪問者實(shí)現(xiàn)“訪問”。
4、代碼結(jié)構(gòu)記憶要點(diǎn):
多個(gè)訪問者都繼承Visitor借口。根據(jù)visit的類型不同,達(dá)到不同的目的即:visit里寫不同的操作。

public interface Visitor {
    public void visit(A a);
    public void visit(B b);
}

14、Android 中介者模式

中介者模式就是把網(wǎng)狀復(fù)雜結(jié)構(gòu)優(yōu)化為一對多結(jié)構(gòu)。起到協(xié)調(diào)作用。
1、代碼結(jié)構(gòu)記憶就是:部門長作為中介者來決策軟件部、硬件部、產(chǎn)品部等之間合作調(diào)用關(guān)系。
2、我們常用的就是Activity當(dāng)中介者,Button,TextView等各種狀態(tài)來顯示各種。Activity協(xié)調(diào)作用。一對多。

-------------------行為型模式------------------

15、Android 代理模式

為其他對象提供一種代理以控制這個(gè)對象的訪問。
1、代理模式就是擁有被代理實(shí)例并代理它的方法,強(qiáng)調(diào)代理二字。
2、代理模式分為靜態(tài)代理和動(dòng)態(tài)代理。
3、靜態(tài)代理就是直接創(chuàng)建一個(gè)代理類。包含所有需要代理的方法。代理調(diào)用一次。通常我們喜歡寫一個(gè)Interface來約束需要代理的方法。
4、動(dòng)態(tài)代理是SDK提供方法。等于用java反射來調(diào)用的需要代理的方法。所以稱之為動(dòng)態(tài)代理。

16、Android 組合模式(View與ViewGroup)

將部分整體的層次結(jié)構(gòu)轉(zhuǎn)換為樹狀結(jié)構(gòu),是的客戶訪問對象和組合對象具有一致性。
1、樹狀結(jié)構(gòu):Head、Node、Leaf
2、三節(jié)點(diǎn)寫法類似。都繼承一個(gè)抽象類。抽象類定義print,add,remove,getChild。
3、每個(gè)節(jié)點(diǎn)以一個(gè)ArrayList<>()來add remove子節(jié)點(diǎn)。并擁有一個(gè)遍歷方法來操作。由于都繼承自同一個(gè)抽象類。所以add remove的對象都可以用抽象類表示。
4、擁有add,remove,getChild的叫透明的組合模式。只有print的叫安全的組合模式。
5、透明的組合模式實(shí)現(xiàn)到Leaf節(jié)點(diǎn)的時(shí)候,繼承抽象類的add,remove等方法都是空實(shí)現(xiàn),因?yàn)闆]有子節(jié)點(diǎn)了。

17、Android 適配器模式(ListView與Adapter)

將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另一個(gè)接口。適配器模式讓那些接口不兼容的類可以一起工作
1、有兩個(gè)接口M,N,兩個(gè)類A,B。A類實(shí)現(xiàn)接口M。現(xiàn)要讓A也兼容N接口。
2、新建適配器類C,類適配器:C extends A implements N. 對象適配器:C implements N,C中擁有A實(shí)例
3、ListView和Adapter關(guān)系:新建適配器抽象類D。D implements N。兼容了N接口并且可以添加其他需要實(shí)現(xiàn)的方法。ListView以setAdapter來獲得適配器。

18、Android 裝飾者模式

裝飾模式指的是在不必改變原類文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對象的功能。和代理模式區(qū)分在于功能拓展,代理模式更強(qiáng)調(diào)代理二字。
1、裝飾者抽象類。擁有被裝飾者實(shí)例并調(diào)用方法。裝飾者實(shí)現(xiàn)類則進(jìn)行功能擴(kuò)展。

19、Android 享元模式

緩存池思想“共享”對象,避免重復(fù)創(chuàng)建。
1、用map緩存,有就直接取用,沒有時(shí)創(chuàng)建并push到map里。
2、Message單鏈表重復(fù)利用表頭也可以。

20、Android 外觀模式

提供統(tǒng)一接口,封裝API。

21、Android 橋接模式

將抽象部分與實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的進(jìn)行變化。
1、實(shí)現(xiàn)部分獨(dú)立,可以用接口或者抽象類實(shí)現(xiàn)
2、抽象部分擁有事項(xiàng)部分實(shí)例,并調(diào)用方法
3、實(shí)現(xiàn)部分主要是對抽象化的事物進(jìn)一步的具體化操作
4、好處就是減少類的個(gè)數(shù),如果只有一個(gè)維度,每有一個(gè)新的實(shí)現(xiàn)就要寫一個(gè)新的類,如果是兩個(gè)維度,就能避免多余類的書寫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內(nèi)容