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 訪問(wèn)者模式
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)用魄衅,多用于語(yǔ)言的文法莫换。所以這里不做詳述。
設(shè)計(jì)模式的六大原則:
總原則:開閉原則轰驳,即對(duì)擴(kuò)展開放眯娱,對(duì)修改關(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ǔ)秘豹,對(duì)接口編程,依賴于抽象而不依賴于具體昌粤。
4 接口隔離原則:使用多個(gè)隔離的接口既绕,比使用單個(gè)接口要好。每個(gè)接口不存在子類用不到卻必須實(shí)現(xiàn)的方法涮坐,否則要將接口拆分凄贩。
5 迪米特法則(最少知道原則):一個(gè)實(shí)體應(yīng)當(dāng)盡量少的與其他實(shí)體之間發(fā)生相互作用,使得系統(tǒng)的功能模塊相對(duì)獨(dú)立袱讹。
6 合成復(fù)用原則:盡量使用合成/聚合方式疲扎,而不是使用繼承。
本文以下都是總結(jié)設(shè)計(jì)模式核心思想和代碼結(jié)構(gòu)要點(diǎn)捷雕。幫助讀者記憶椒丧。閱讀前建議先閱讀鏈接里面的具體講解,理解設(shè)計(jì)模式本身再記憶
23中設(shè)計(jì)模式分類:
創(chuàng)建型模式:工廠方法模式 抽象工廠模式 單例模式 建造者模式 原型模式 (簡(jiǎn)單工廠模式)
結(jié)構(gòu)型模式:代理模式 裝飾器模式 適配器模式 外觀模式 組合模式 享元模式 橋接模式
行為型模式:觀察者模式 責(zé)任鏈模式 模板方法模式 策略模式 迭代子模式 命令模式 狀態(tài)模式 備忘錄模式 訪問(wèn)者模式 中介者模式 解釋器模式
溫故而知新可以為師矣
理解很重要救巷,記住更重要壶熏,以下是總結(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方法亭珍,來(lái)提供類可以clone敷钾。
3、int string這種是值類型肄梨,類的對(duì)象叫引用類型阻荒。
4、數(shù)值拷貝沒(méi)有深淺拷貝之分众羡,注意引用變量拷貝侨赡,如果沒(méi)有再次加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)榻涌谑浅橄蟪鰜?lái)的。所以叫抽象工廠藐不。
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è)判斷來(lái)寫雏蛮∠呀溃或者一個(gè)產(chǎn)品對(duì)應(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)在對(duì)一個(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判斷是否處理,如果處理請(qǐng)求終止友酱,如果不處理傳遞給B晴音,這樣一直傳遞。形成鏈?zhǔn)浇Y(jié)構(gòu)
1缔杉、代碼結(jié)構(gòu)锤躁。類擁有一個(gè)next對(duì)象。根據(jù)自己的條件判斷是否調(diào)用到next或详∠敌撸看如下抽象類。
abstract class Leader {
static final String TAG = Leader.class.getSimpleName();
public Leader nextLeader; // 上一級(jí)領(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)請(qǐng)假天數(shù)
abstract void handle(StaffRequestLeave staff); // 處理請(qǐng)假
abstract void refuseRequest(); // 拒絕請(qǐng)假
}
8椒振、Android 命令模式
“行為請(qǐng)求者”與“行為實(shí)現(xiàn)者”解耦。多個(gè)命令與行為一一對(duì)應(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ú)的類來(lái)保存和讀取狀態(tài)袁铐。避免直接訪問(wèn)數(shù)據(jù)和內(nèi)部實(shí)現(xiàn)揭蜒。
1、比如MP3剔桨,單獨(dú)寫一個(gè)類來(lái)保存歌名屉更,播放百分比。退出則保存這些數(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>對(duì)象。
容器擁有迭代器的核心代碼:
@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 訪問(wèn)者模式
1空厌、被訪問(wèn)者不變。
2银酬、根據(jù)訪問(wèn)者和被訪問(wèn)者的不同嘲更,兩兩對(duì)應(yīng)達(dá)到不同的目的。
3揩瞪、遍歷被訪問(wèn)者實(shí)現(xiàn)“訪問(wèn)”赋朦。
4、代碼結(jié)構(gòu)記憶要點(diǎn):
多個(gè)訪問(wèn)者都繼承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)化為一對(duì)多結(jié)構(gòu)毛嫉。起到協(xié)調(diào)作用。
1妇菱、代碼結(jié)構(gòu)記憶就是:部門長(zhǎng)作為中介者來(lái)決策軟件部承粤、硬件部暴区、產(chǎn)品部等之間合作調(diào)用關(guān)系。
2辛臊、我們常用的就是Activity當(dāng)中介者仙粱,Button,TextView等各種狀態(tài)來(lái)顯示各種。Activity協(xié)調(diào)作用彻舰。一對(duì)多伐割。
-------------------行為型模式------------------
15、Android 代理模式
為其他對(duì)象提供一種代理以控制這個(gè)對(duì)象的訪問(wèn)刃唤。
1隔心、代理模式就是擁有被代理實(shí)例并代理它的方法,強(qiáng)調(diào)代理二字透揣。
2济炎、代理模式分為靜態(tài)代理和動(dòng)態(tài)代理。
3辐真、靜態(tài)代理就是直接創(chuàng)建一個(gè)代理類须尚。包含所有需要代理的方法。代理調(diào)用一次侍咱。通常我們喜歡寫一個(gè)Interface來(lái)約束需要代理的方法耐床。
4、動(dòng)態(tài)代理是SDK提供方法楔脯。等于用java反射來(lái)調(diào)用的需要代理的方法撩轰。所以稱之為動(dòng)態(tài)代理。
16昧廷、Android 組合模式(View與ViewGroup)
將部分整體的層次結(jié)構(gòu)轉(zhuǎn)換為樹狀結(jié)構(gòu)堪嫂,是的客戶訪問(wèn)對(duì)象和組合對(duì)象具有一致性。
1木柬、樹狀結(jié)構(gòu):Head皆串、Node、Leaf
2眉枕、三節(jié)點(diǎn)寫法類似恶复。都繼承一個(gè)抽象類。抽象類定義print速挑,add谤牡,remove,getChild姥宝。
3翅萤、每個(gè)節(jié)點(diǎn)以一個(gè)ArrayList<>()來(lái)add remove子節(jié)點(diǎn)。并擁有一個(gè)遍歷方法來(lái)操作腊满。由于都繼承自同一個(gè)抽象類断序。所以add remove的對(duì)象都可以用抽象類表示流纹。
4、擁有add,remove,getChild的叫透明的組合模式违诗。只有print的叫安全的組合模式漱凝。
5、透明的組合模式實(shí)現(xiàn)到Leaf節(jié)點(diǎn)的時(shí)候诸迟,繼承抽象類的add茸炒,remove等方法都是空實(shí)現(xiàn),因?yàn)闆](méi)有子節(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. 對(duì)象適配器:C implements N搪花,C中擁有A實(shí)例
3遏片、ListView和Adapter關(guān)系:新建適配器抽象類D。D implements N撮竿。兼容了N接口并且可以添加其他需要實(shí)現(xiàn)的方法吮便。ListView以setAdapter來(lái)獲得適配器。
18幢踏、Android 裝飾者模式
裝飾模式指的是在不必改變?cè)愇募褪褂美^承的情況下髓需,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。和代理模式區(qū)分在于功能拓展惑折,代理模式更強(qiáng)調(diào)代理二字授账。
1枯跑、裝飾者抽象類惨驶。擁有被裝飾者實(shí)例并調(diào)用方法。裝飾者實(shí)現(xiàn)類則進(jìn)行功能擴(kuò)展敛助。
19粗卜、Android 享元模式
緩存池思想“共享”對(duì)象,避免重復(fù)創(chuàng)建纳击。
1续扔、用map緩存攻臀,有就直接取用,沒(méi)有時(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)部分主要是對(duì)抽象化的事物進(jìn)一步的具體化操作
4、好處就是減少類的個(gè)數(shù)衰絮,如果只有一個(gè)維度袍冷,每有一個(gè)新的實(shí)現(xiàn)就要寫一個(gè)新的類,如果是兩個(gè)維度猫牡,就能避免多余類的書寫