參照:https://cbk419323.blog.csdn.net/article/details/104171307
一史隆、創(chuàng)建型模式
共五種:工廠方法模式魂务、抽象工廠模式、單例模式泌射、建造者模式粘姜、原型模式熔酷。
簡單工廠&工廠方法&抽象工廠模式的區(qū)別:
??簡單工廠
??工廠方法
??抽象工廠模式
1孤紧、單例模式(Singleton Pattern):
Ensure a class has only one instance, and provide a global point of access to it. 確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例拒秘。
java: #
android: #
開發(fā)實踐:public static getInstance(){}
2.1号显、簡單工廠方法:--TODO
開發(fā)實踐:針對接口編程(IDownload ) +依據(jù)參數(shù)決定 創(chuàng)建特定下載類型的派生類對象
public static IDownload createDownloadImpl(int dltype){}
2.2、工廠方法(Factory Pattern) --TODO
Define an interface for creating an object,but let subclasses decide which class toinstantiate.Factory Method lets a class defer instantiation to subclasses.定義一個用于創(chuàng)建對象的接口翼抠,讓子類決定實例化哪一個類咙轩。工廠方法使一個類的實例化延遲到其子類。
java:
??java.lang.Object#toString() (在其子類中可以覆蓋該方法)
??java.lang.Class#newInstance() 借助Class對象阴颖,對象實例化
??java.lang.Integer#valueOf()
??java.lang.Class#forName() 依據(jù)類名活喊,創(chuàng)建其Class對象
??java.lang.reflect.Array#newInstance() 借助Class 對象,實例化數(shù)組對象
android: #
3量愧、抽象工廠模式(Abstract Factory Pattern)--TODO
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.為創(chuàng)建一組相關(guān)或相互依賴的對象提供一個接口钾菊,而且無需指定它們的具體類。
java:
??java.util.Arrays#asList() ??
android: #
開發(fā)實踐:
4偎肃、原型模式(Prototype?Pattern)--TODO
Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.用原型實例指定創(chuàng)建對象的種類煞烫,并且通過拷貝這些原型創(chuàng)建新的對象。
優(yōu)點(diǎn):原型模式是在內(nèi)存二進(jìn)制流的拷貝累颂,要比直接new一個對象性能好很多滞详,特別是要在一個循環(huán)體內(nèi)產(chǎn)生大量對象時凛俱,原型模式可以更好地提現(xiàn)特點(diǎn)。
缺點(diǎn):構(gòu)造函數(shù)不會被執(zhí)行料饥。
java: #
android:
Bitmap.copy(Config):(蒲犬??)
比如我們需要一張Bitmap的幾種不同格式:ARGB_8888岸啡、RGB_565原叮、ARGB_4444、ALAPHA_8等巡蘸。那我們就可以先創(chuàng)建一個ARGB_8888的Bitmap作為原型奋隶,在它的基礎(chǔ)上,通過調(diào)用Bitmap.copy(Config)來創(chuàng)建出其它幾種格式的Bitmap悦荒。
開發(fā)實踐:#
5唯欣、建造者模式:--比如AlertDialog.Builder()
Separate the construction of a complex object from its representation so that the sameconstruction process can create different representations.將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示搬味。
java: java.lang.StringBuilder#append()
android: AlertDialog.Builder
開發(fā)實踐:Retrofit&OkHttpClient的對象構(gòu)建
二黍聂、結(jié)構(gòu)型模式
共七種:代理模式、享元模式身腻、適配器模式产还、裝飾器模式、外觀模式嘀趟、橋接模式脐区、組合模式。
適配器&外觀&裝飾者的區(qū)別:
??適配器模式的意圖:是改變接口以符合client的期望她按。
??外觀模式的意圖:是提供復(fù)雜子系統(tǒng)的一個簡化接口牛隅,讓接口更簡單。
??裝飾者模式的意圖:是不改變接口酌泰,但加入新的行為和責(zé)任媒佣。
6、代理模式:
Provide a surrogate or placeholder for another object to control access to it. 為其他對象提供一種代理以控制對這個對象的訪問陵刹。
優(yōu)點(diǎn):代理類包裝了代理類默伍,以控制對此對象的訪問;用戶不需要了解被代理類的技術(shù)實現(xiàn)細(xì)節(jié)衰琐。
java: ??java.lang.reflect.Proxy
android:
開發(fā)實踐:所有的AIDL都一個代理模式的例子也糊。假設(shè)一個Activity A去綁定一個Service S,那么A調(diào)用S中的每一個方法其實都是通過系統(tǒng)的Binder機(jī)制的中轉(zhuǎn)羡宙,然后調(diào)用S中的對應(yīng)方法來做到的狸剃。Binder機(jī)制就起到了代理的作用。
7狗热、享元模式:--比如Integer#valueOf()
Use sharing to support large numbers of fine-grained objects efficiently. 使用共享對象可有效地支持大量的細(xì)粒度對象钞馁。
優(yōu)點(diǎn):代理類包裝了代理類虑省,以控制對此對象的訪問;用戶不需要了解被代理類的技術(shù)實現(xiàn)細(xì)節(jié)僧凰。
java:
??java.lang.reflect.Proxy
? java.lang.Integer#valueOf(int)
android:
Message.obtainMessage():通過重用Message對象來避免大量的Message對象被頻繁的創(chuàng)建和銷毀慷妙。
開發(fā)實踐:#
8、適配器模式(Adapter Pattern):
Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interface. 適配器將一個類的接口轉(zhuǎn)換成客戶端所期待的另一種接口允悦,讓原本因為接口不匹配而無法在一起工作的兩個類能在一起工作。
優(yōu)點(diǎn):#
java:
android:
ListView或GridView的Adapter
TelecomAdapter (InCallUI->Telecom 之間apis轉(zhuǎn)換)
開發(fā)實踐:#
9虑啤、裝飾者模式(Decorator?Pattern):
Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality. 動態(tài)地將責(zé)任附加到對象上隙弛。若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案狞山。能夠在不修改任何底層代碼的情況下全闷,給你的或別人的對象賦予新的職責(zé)。
優(yōu)點(diǎn):
a. 組件和裝飾者可以獨(dú)立發(fā)展萍启,而不互相耦合总珠;
b. 是繼承關(guān)系的一個替代方案。若使用繼承時子類非常多勘纯,會導(dǎo)致類爆炸局服,可用裝飾者模式。--使用組合而非繼承驳遵,可以在運(yùn)行時動態(tài)地進(jìn)行擴(kuò)展淫奔;
c. 可以動態(tài)地擴(kuò)展一個實現(xiàn)類的功能。如要增加新的修飾條件堤结,增加一個ConcreteDecorator即可唆迁。
缺點(diǎn):多層的裝飾是比較復(fù)雜。
java:
android:
ListView或GridView的Adapter
TelecomAdapter (InCallUI->Telecom 之間apis轉(zhuǎn)換)
開發(fā)實踐:#
10竞穷、外觀模式(Facade Pattern唐责,門面模式):--比如電視遙控器(集成各子模塊的操作)
Facade Pattern: Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use. 外觀模式:為子系統(tǒng)中的一組接口提供一個統(tǒng)一的入口。外觀模式定義了一個高層接口瘾带,這個接口使得這一子系統(tǒng)更加容易使用鼠哥。?
優(yōu)點(diǎn):
a. 簡化了復(fù)雜的接口,客戶端只需與外觀交流看政,而無需知道具體的子系統(tǒng)組件肴盏;符合 迪米特法則(最少知識原則)。
b. 還將客戶從組件的子系統(tǒng)中解耦帽衙,例如若組件升級菜皂,只需要修改外觀代碼即可,無需修改客戶端代碼厉萝。
java: #
android: #
開發(fā)實踐:#
11恍飘、組合模式(Composite Pattern):--比如File(同時表示文件+文件夾 樹目錄結(jié)構(gòu))
Composite Pattern (又叫 部分-整體模式榨崩,Part-Whole), composite objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. 將對象組合成樹形結(jié)構(gòu)來表現(xiàn)“部分-整體”的層次結(jié)構(gòu),使客戶以一致的方式來處理單個(葉子節(jié)點(diǎn))對象和組合(樹枝節(jié)點(diǎn))對象章母。?
優(yōu)點(diǎn):
a. 葉子節(jié)點(diǎn)(單個對象)母蛛、樹枝節(jié)點(diǎn)(組合對象)對用戶透明;即可以將相同的操作應(yīng)用在組合對象和單個對象上乳怎。
b. 高層模塊調(diào)用簡單彩郊;局部和整體對調(diào)用者來說沒有任何區(qū)別。
c. 節(jié)點(diǎn)增加自由蚪缀。
缺點(diǎn):組合模式以犧牲單一職責(zé)原則來換取透明性:同一個節(jié)點(diǎn)既負(fù)責(zé)“組合方法”秫逝、又負(fù)責(zé)“操作方法”
java:
?java.util.Map#putAll(Map)
?java.util.List#addAll(Collection) ?询枚?
?java.util.Set#addAll(Collection)
android: #
開發(fā)實踐:#
12违帆、橋接模式(Bridge Pattern,橋梁模式):--比如JDBC驅(qū)動器
Decouple an abstraction from its implementation so that the two can vary independently. 將抽象和實現(xiàn)解耦金蜀,使得兩者可以獨(dú)立的變化刷后。
相關(guān)概念:
JDBC(Java?DataBase?Connectivity):是Java和數(shù)據(jù)庫之間的一個橋梁,是一個規(guī)范而不是一個實現(xiàn)渊抄,能夠執(zhí)行SQL語句尝胆。它由一組用Java語言編寫的類和接口組成。各種不同類型的數(shù)據(jù)庫都有相應(yīng)的實現(xiàn)护桦。
優(yōu)點(diǎn):
? 把抽象部分和具體部分分離開來班巩,從而使得抽象部分和具體部分都可以獨(dú)立地擴(kuò)展。
? 對于應(yīng)用程序而言嘶炭,只要選用不同的驅(qū)動抱慌,就可以讓程序操作不同的數(shù)據(jù)庫,而無需更改應(yīng)用程序眨猎,從而實現(xiàn)在不同的數(shù)據(jù)庫上移植抑进;對于驅(qū)動程序而言,為數(shù)據(jù)庫實現(xiàn)不同的驅(qū)動程序睡陪,并不會影響應(yīng)用程序寺渗。
缺點(diǎn):組合模式以犧牲單一職責(zé)原則來換取透明性:同一個節(jié)點(diǎn)既負(fù)責(zé)“組合方法”、又負(fù)責(zé)“操作方法”
java:
??AWT (提供了抽象層映射于實際的操作系統(tǒng))
?JDBC
android: #
開發(fā)實踐:#
三兰迫、關(guān)系型模式
關(guān)系型模式信殊,共十一種:狀態(tài)模式、命令模式汁果、模板方法模式涡拘、迭代器模式、策略模式据德、觀察者模式鳄乏、責(zé)任鏈模式跷车、解釋器模式、備忘錄模式橱野、訪問者模式朽缴、中介者模式。
13水援、狀態(tài)模式(State?Pattern)--比如StateMachine狀態(tài)機(jī)功能
Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
狀態(tài)模式允許對象在其內(nèi)部狀態(tài)改變時改變其它的行為密强,對象看起來好像修改了它的類。
優(yōu)點(diǎn):
a. 結(jié)構(gòu)清晰蜗元;避免了過多的條件語句
b. 體現(xiàn)了開閉原則或渤、單一職責(zé)原則;每個狀態(tài)都是一個子類许帐,增加狀態(tài)的話 只要增加一個子類即可。
c. 封裝性好毕谴;狀態(tài)的變換 放到類的內(nèi)部實現(xiàn)
缺點(diǎn):新增一個state時成畦,需要新增一個子類,state子類很多涝开。
java: #
android:
View.onVisibilityChanged方法:就是提供了一個狀態(tài)模式的實現(xiàn)循帐,允許在View的visibility發(fā)生改變時,引發(fā)執(zhí)行onVisibilityChanged方法中的動作舀武。(狀態(tài)發(fā)生改變時拄养,行為改變。)
開發(fā)實踐:#
14银舱、命令模式(Command Pattern)--比如任務(wù):Runnable.run和Callable.call()
Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.
將請求封裝成對象瘪匿,以便使用不同的請求、隊列寻馏、或日志將客戶端參數(shù)化棋弥,同時提供可撤銷功能。
優(yōu)點(diǎn):
a. 解耦:Invoker和Receiver完全解耦诚欠,不需要直接溝通顽染。Command對象中封裝了Receiver,及其要做的事情轰绵。
b. 可擴(kuò)展:日后增加新的Command子類粉寞,即可增加新功能。
c. 可結(jié)合其他模式左腔,例如責(zé)任鏈模式唧垦、模板方法模式。
缺點(diǎn):Command子類可能會非常多液样。(可結(jié)合模板方法模式解決)
java:
??java.lang.Runnable
??javax.swing.Action
android: #
開發(fā)實踐:#
15业崖、模板方法模式(Template?Method)--比如Android AsyncTask.doInBackground()?
Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses define certain steps of an algorithm without changing the algorithm's structure.?
模板方法模式在一個方法中定義一個算法的骨架野芒,而將一些步驟的實現(xiàn)延遲到子類中。模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下双炕,重新定義算法中某些步驟的具體實現(xiàn)狞悲。
優(yōu)點(diǎn):#
缺點(diǎn):#
java:
?java.io.InputStream|OutputStream|Reader|Writer的所有非抽象方法(算法骨架)
?java.util.AbstractList|AbstractSet|AbstractMap的所有非抽象方法(算法骨架)
android: #
開發(fā)實踐:#
16、迭代器模式(Iterator Pattern)--比如自定義遍歷容器 implements?Iterator
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
迭代器模式提供了一種方法順序訪問一個聚合對象中的各個元素妇斤,而又不暴露該對象的內(nèi)部表示摇锋。
優(yōu)點(diǎn):#
缺點(diǎn):#
java:
??java.util.Iterator
??java.util.Enumeration
android: #
開發(fā)實踐:
迭代器使用規(guī)則:
??自行實現(xiàn)可遍歷容器時:建議只implements?Iterator(實現(xiàn)Collection則代碼邏輯較復(fù)雜);
??使用Java內(nèi)置容器時:建議針對Collection接口編程站超。
17荸恕、策略模式(Strategy Pattern)
--比如:依賴注入場景(舉例:自行實現(xiàn)Comparator.compare()比較策略,再調(diào)用容器.sort()算法實現(xiàn)定制排序)
Define a family of algorithms,encapsulate each one,and make them interchangeable.
定義一組算法死相,將每個算法都封裝起來融求,并且使它們之間可以互換。
優(yōu)點(diǎn):#
缺點(diǎn):#
java:
??java.util.Comparator#compare()
??Java.util.List:
定義了增(add)算撮、刪(remove)生宛、改(set)、查(indexOf)策略肮柜,至于實現(xiàn)這個策略的ArrayList陷舅、LinkedList等類,只是在具體實現(xiàn)時采用了不同的算法审洞。但因為它們策略一樣莱睁,不考慮速度的情況下,使用時完全可以互相替換使用芒澜。
android: #
18仰剿、觀察者模式(Observer Pattern)--比如:--注冊&注銷監(jiān)聽
Define a one-to-many dependency between objects so that when one object changes state,all itsdependents are notified and updated automatically。定義對象間一種一對多的依賴關(guān)系痴晦,使得每當(dāng)一個對象改變狀態(tài)酥馍,則所有依賴于它的對象都會得到通知并被自動更新。
觀察者模式是對象的行為模式阅酪,又叫發(fā)布-訂閱(publish/subscribe)模式旨袒,模型-視圖(moder/view)模式,源-監(jiān)聽器(source/listener)模式或從屬者(dependent)模式术辐。
相關(guān)概念:監(jiān)聽Listener&回調(diào)Callback的區(qū)別:
?監(jiān)聽Listener:動態(tài)注冊addListener() & removeListener()砚尽,維護(hù)監(jiān)聽ArrayList數(shù)組或列表。
?回調(diào)Callback:方法調(diào)用時辉词,傳入callback para必孤,由執(zhí)行方?jīng)Q定callback的觸發(fā)條件。
優(yōu)點(diǎn):#
缺點(diǎn):#
java: #
android:#
19、責(zé)任鏈模式(Chain of Responsibility?Pattern)--比如:AI語義識別(采用多個場景parse過濾鏈機(jī)制)
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.
使多個對象有機(jī)會處理請求敷搪,從而避免了請求的發(fā)送者和接收者之間的耦合關(guān)系 兴想。將這些對象連成一個鏈,并沿著這條鏈傳遞請求赡勘,直到有對象處理它為止嫂便。
優(yōu)點(diǎn):#
缺點(diǎn):#
java:
??javax.servlet.Filter#doFilter()
android: #
20、解釋器模式(Interpreter?Pattern)--比如Date和Time格式化顯示功能
Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences int the language.
給定一門語言闸与,定義它的文法的一種表示毙替,并定義一個解釋器,該解釋器使用該表示來解釋語言中的句子践樱。
優(yōu)點(diǎn):#
缺點(diǎn):不要在for循環(huán)中使用到備忘錄模式厂画,會產(chǎn)生大量的數(shù)據(jù)。
java:
??java.util.Pattern
??java.text.Normalizer
??java.text.Format
android:#
21拷邢、備忘錄模式(Memento?Pattern)--比如:序列化Serializable和Parcelable
Without violating encapsulation袱院, capture and externalize an object’s internal state so that the object can be restored to this state later.
在不破壞封裝的前提下,捕獲一個對象的內(nèi)部狀態(tài)瞭稼,并在該對象之外保存這個狀態(tài)忽洛,這樣以后就可將該對象恢復(fù)到原來保存的狀態(tài)。
優(yōu)點(diǎn):#
缺點(diǎn):不要在for循環(huán)中使用到備忘錄模式弛姜,會產(chǎn)生大量的數(shù)據(jù)脐瑰。
java:
?java.util.Date
?java.io.Serializable
?javax.faces.component.StateHolder
android:
?Parcelable
22妖枚、訪問者模式(Visitor?Pattern)
Represent an operation to be performed on the elements of an object structure.Visitor lets you define a new operation without changing the classes of the elements on which it operates.
封裝一些作用于某種數(shù)據(jù)結(jié)構(gòu)中的各種元素廷臼,它可以在不改變數(shù)據(jù)結(jié)構(gòu)的前提下定義作用于這些元素的新的操作。
優(yōu)點(diǎn):#
缺點(diǎn):#
java: #
android:#
23绝页、中介者模式(Mediator?Pattern)
--比如:MVC(C相當(dāng)于中介者荠商,減少了M和V之間的耦合)。
Define an object that encapsulates how a set of objects interact. Mediator promotes loose couping by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.
用一個中介對象封裝一系列的對象交互续誉,中介者使各對象不需要顯示的相互作用莱没,從而使其耦合松散,而且可以獨(dú)立的改變它們之間的交互酷鸦。
優(yōu)點(diǎn):中介者讓各個系統(tǒng)之間可以獨(dú)立饰躲,同時又可以交互。
缺點(diǎn):#
java: #
android:#