Android 23種設計模式

0
回復
146
查看
打印 上一主題 下一主題
[復制鏈接]

37

主題

57

帖子

3077

安幣

管理員

Rank: 9Rank: 9Rank: 9

樓主
發表于 2020-4-16 16:15:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如果對本篇文章感興趣,請前往,原文地址:http://www.clfrpjw.com.cn/blog-720372-83927.html

1、Android 單例模式
2、Android Builder模式
3、Android 原形模式(深淺拷貝)
4、Android 工廠模式
5、Android 策略模式
6、Android 狀態模式
7、Android 責任鏈模式
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 橋接模式
停止更新...
以上工廠模式其實是兩種設計模式。包含工廠模式和抽象工廠模式,缺少“解釋器模式”由于這種模式極少運用,多用于語言的文法。所以這里不做詳述。
設計模式的六大原則:
總原則:開閉原則,即對擴展開放,對修改關閉。
1 單一職責原則:每個類應該實現單一的職責,否則應該把類拆分。
2 里氏替換原則:任何基類可以出現的地方,子類一定可以出現。它是繼承復用的基石,只有當衍生類可以替換掉基類,軟件單位的功能不受影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為。
3 依賴倒轉原則:這是開閉原則的基礎,對接口編程,依賴于抽象而不依賴于具體。
4 接口隔離原則:使用多個隔離的接口,比使用單個接口要好。每個接口不存在子類用不到卻必須實現的方法,否則要將接口拆分。
5 迪米特法則(最少知道原則):一個實體應當盡量少的與其他實體之間發生相互作用,使得系統的功能模塊相對獨立。
6 合成復用原則:盡量使用合成/聚合方式,而不是使用繼承。
本文以下都是總結設計模式核心思想和代碼結構要點。幫助讀者記憶。閱讀前建議先閱讀鏈接里面的具體講解,理解設計模式本身再記憶
23中設計模式分類:
創建型模式:工廠方法模式 抽象工廠模式 單例模式 建造者模式 原型模式 (簡單工廠模式)
結構型模式:代理模式 裝飾器模式 適配器模式 外觀模式 組合模式 享元模式 橋接模式
行為型模式:觀察者模式 責任鏈模式 模板方法模式 策略模式 迭代子模式 命令模式 狀態模式 備忘錄模式 訪問者模式 中介者模式 解釋器模式
溫故而知新可以為師矣

理解很重要,記住更重要,以下是總結各個模式知識點記憶要點。推薦配合代碼記憶。
-------------------創建型模式------------------
1、Android 單例模式

1、一共五種方案。核心就是私有構造方法,使得創建的實例只有一個。以后都復用這個實例。
2、推薦使用帶有synchronized線程保護的DCL方式,和靜態內部類static final變量定義類的方式
// DLCpublic 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;    }}// 靜態內部類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模式

外部類私有構造方法帶參數Buidler(靜態內部類),Builder定義build方法創建外部類。
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、原型模式就是一個拷貝。
2、實現implements Cloneable的clone方法,來提供類可以clone。
3、int string這種是值類型,類的對象叫引用類型。
4、數值拷貝沒有深淺拷貝之分,注意引用變量拷貝,如果沒有再次加clone方法,默認是淺拷貝。淺拷貝:獲得變量本身,深拷貝:獲得一個新的一模一樣的變量。
4、Android 工廠模式

1、工廠模式分為普通工廠模式、抽象工廠模式。
2、普通工廠模式產品用抽象類定義,抽象工廠的產品用接口定義。區別在于生產的產品上。普通工廠創建的都是具體的產品。而抽象工廠創建的時接口。因為接口是抽象出來的。所以叫抽象工廠。
3、工廠代碼結構要點:
普通工廠
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一個一個判斷來寫。或者一個產品對應一個工廠。都是可以的。根據需求變化。
抽象工廠
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();    }}
抽象工廠就是生產接口。因為類繼承接口就擁有接口的特性。所以我們稱這種生產接口的工廠模式為抽象的工廠模式。當然工廠類跟普通工廠一樣。可以自己根據需求隨意變化。
-------------------行為型模式------------------
5、Android 策略模式

策略模式側重于提供不同的策略
1、假設我們現在對一個數組從小到大排序,這個時候我們寫了兩個策略,都繼承自同一接口。實現時一個冒泡排序,一個插入排序。兩個策略。結果都能正常排序。所以策略模式的重點是不同的策略上。
6、Android 狀態模式

根據狀態的不同,提供不同的行為。
1、以下Monday就是一個狀態。這個狀態下,limit有自己的實現。
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 責任鏈模式

鏈式結構處理,A判斷是否處理,如果處理請求終止,如果不處理傳遞給B,這樣一直傳遞。形成鏈式結構
1、代碼結構。類擁有一個next對象。根據自己的條件判斷是否調用到next。看如下抽象類。
abstract class Leader {    static final String TAG = Leader.class.getSimpleName();    public Leader nextLeader; // 上一級領導    public final void handleLeave(StaffRequestLeave staff) {        if (staff.getDays() <= getHandleLeaveDays()) {            handle(staff);        } else {            if (nextLeader != null) {                Log.d("Leader", "不處理,流轉");                nextLeader.handleLeave(staff);            } else {                refuseRequest();            }        }    }    abstract int getHandleLeaveDays(); // 批準請假天數    abstract void handle(StaffRequestLeave staff); // 處理請假    abstract void refuseRequest(); // 拒絕請假}
8、Android 命令模式

“行為請求者”與“行為實現者”解耦。多個命令與行為一一對應。
代碼結構記憶如下:
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、具體的功能實現在Television里面。相當于用接口Command獲得tv實例封裝了一下。這樣客戶端調用就是lfteCommand.execute();不關注具體實現。
9、Android 觀察者模式

一個list合集,提供add,remove遍歷觀察者,在調用具體方法的時候遍歷list里的觀察者,并調用觀察者的方法
@Override    public void sun() {        for (WeatherOberver observerListener : list) {            observerListener.sun();        }    }
10、Android 備忘錄模式

用單獨的類來保存和讀取狀態。避免直接訪問數據和內部實現。
1、比如MP3,單獨寫一個類來保存歌名,播放百分比。退出則保存這些數據。再次進入就讀取這些狀態。
11、Android 迭代器模式

根據傳入的list額外提供一個遍歷方法。
1、迭代器實現如下
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、通常一個容器就是一個普通的list除開add remove基礎方法。
2、除開list之外再擁有一個IteratorImpl<T>對象。
容器擁有迭代器的核心代碼:
@Override    public Iterator<T> iterator() {        return new IteratorImpl<>(list);    }
調用如下:
Iterator<String> iterator = containerImpl.iterator();// 迭代器提供遍歷方法,遍歷while (iterator.hasNext()) {    Log.d("Iterator",iterator.next());}
12、Android 模板方法模式

流程封裝,父類封裝不可變方法。子類實現部分或全部可擴展方法。
1、代碼結構。直接記Activity中的onCreate,onResume就是模板方法模式。
13、Android 訪問者模式

1、被訪問者不變。
2、根據訪問者和被訪問者的不同,兩兩對應達到不同的目的。
3、遍歷被訪問者實現“訪問”。
4、代碼結構記憶要點:
多個訪問者都繼承Visitor借口。根據visit的類型不同,達到不同的目的即:visit里寫不同的操作。
public interface Visitor {    public void visit(A a);    public void visit(B b);}
14、Android 中介者模式

中介者模式就是把網狀復雜結構優化為一對多結構。起到協調作用。
1、代碼結構記憶就是:部門長作為中介者來決策軟件部、硬件部、產品部等之間合作調用關系。
2、我們常用的就是Activity當中介者,Button,TextView等各種狀態來顯示各種。Activity協調作用。一對多。
-------------------行為型模式------------------
15、Android 代理模式

為其他對象提供一種代理以控制這個對象的訪問。
1、代理模式就是擁有被代理實例并代理它的方法,強調代理二字。
2、代理模式分為靜態代理和動態代理。
3、靜態代理就是直接創建一個代理類。包含所有需要代理的方法。代理調用一次。通常我們喜歡寫一個Interface來約束需要代理的方法。
4、動態代理是SDK提供方法。等于用java反射來調用的需要代理的方法。所以稱之為動態代理。
16、Android 組合模式(View與ViewGroup)

將部分整體的層次結構轉換為樹狀結構,是的客戶訪問對象和組合對象具有一致性。
1、樹狀結構:Head、Node、Leaf
2、三節點寫法類似。都繼承一個抽象類。抽象類定義print,add,remove,getChild。
3、每個節點以一個ArrayList<>()來add remove子節點。并擁有一個遍歷方法來操作。由于都繼承自同一個抽象類。所以add remove的對象都可以用抽象類表示。
4、擁有add,remove,getChild的叫透明的組合模式。只有print的叫安全的組合模式。
5、透明的組合模式實現到Leaf節點的時候,繼承抽象類的add,remove等方法都是空實現,因為沒有子節點了。
17、Android 適配器模式(ListView與Adapter)

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

裝飾模式指的是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。和代理模式區分在于功能拓展,代理模式更強調代理二字。
1、裝飾者抽象類。擁有被裝飾者實例并調用方法。裝飾者實現類則進行功能擴展。
19、Android 享元模式

緩存池思想“共享”對象,避免重復創建。
1、用map緩存,有就直接取用,沒有時創建并push到map里。
2、Message單鏈表重復利用表頭也可以。
20、Android 外觀模式

提供統一接口,封裝API。
21、Android 橋接模式

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



作者:Yink_Liu
鏈接:https://www.jianshu.com/p/457e81b3d8d2
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
  繼續閱讀全文



想在安卓巴士找到更多優質博文,可移步博客區

如果對本篇文章感興趣,請前往,
原文地址:
http://www.clfrpjw.com.cn/blog-720372-83927.html
分享到:  QQ好友和群 QQ空間 微信
收藏
收藏0
支持
支持0
反對
反對0
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

时时彩改欢乐生肖 河北十一选五前三 江苏快3销售平台 广东十一选五一定牛 网上李逵捕鱼赢钱技巧 斗牛棋牌游戏? 云南快乐十分近100期 6加1开奖号码是多少 六台宝典 图库 彩图 26选5开奖最新信息 浙江6+1开奖结果 哈尔滨麻将机维修 幸运排列3走势图 江西多乐彩登陆 追光娱乐官网下载 甘肃11选5五码遗漏 大泽佑香和28M黑人封面