Android 設(shè)計(jì)模式入門到精通:GoF23總結(jié)篇

參照:https://cbk419323.blog.csdn.net/article/details/104171307

一、創(chuàng)建型模式

共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

簡(jiǎn)單工廠&工廠方法&抽象工廠模式的區(qū)別:

??簡(jiǎn)單工廠

??工廠方法

??抽象工廠模式


1、單例模式(Singleton Pattern):

Ensure a class has only one instance, and provide a global point of access to it. 確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。

java: #

android: #

開(kāi)發(fā)實(shí)踐:public static getInstance(){}


2.1、簡(jiǎn)單工廠方法:--TODO

開(kāi)發(fā)實(shí)踐:針對(duì)接口編程(IDownload ) +依據(jù)參數(shù)決定 創(chuàng)建特定下載類型的派生類對(duì)象

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.定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類。

java:

??java.lang.Object#toString() (在其子類中可以覆蓋該方法)

??java.lang.Class#newInstance() 借助Class對(duì)象,對(duì)象實(shí)例化

??java.lang.Integer#valueOf()

??java.lang.Class#forName() 依據(jù)類名,創(chuàng)建其Class對(duì)象

??java.lang.reflect.Array#newInstance() 借助Class 對(duì)象,實(shí)例化數(shù)組對(duì)象

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)或相互依賴的對(duì)象提供一個(gè)接口,而且無(wú)需指定它們的具體類。

java:

??java.util.Arrays#asList() ??

android: #

開(kāi)發(fā)實(shí)踐:


4、原型模式(Prototype?Pattern)--TODO

Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。

優(yōu)點(diǎn):原型模式是在內(nèi)存二進(jìn)制流的拷貝,要比直接new一個(gè)對(duì)象性能好很多,特別是要在一個(gè)循環(huán)體內(nèi)產(chǎn)生大量對(duì)象時(shí),原型模式可以更好地提現(xiàn)特點(diǎn)。

缺點(diǎn):構(gòu)造函數(shù)不會(huì)被執(zhí)行。

java: #

android:

Bitmap.copy(Config):(??)

比如我們需要一張Bitmap的幾種不同格式:ARGB_8888、RGB_565、ARGB_4444、ALAPHA_8等。那我們就可以先創(chuàng)建一個(gè)ARGB_8888的Bitmap作為原型,在它的基礎(chǔ)上,通過(guò)調(diào)用Bitmap.copy(Config)來(lái)創(chuàng)建出其它幾種格式的Bitmap。

開(kāi)發(fā)實(shí)踐:#


5、建造者模式:--比如AlertDialog.Builder()

Separate the construction of a complex object from its representation so that the sameconstruction process can create different representations.將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。

java: java.lang.StringBuilder#append()

android: AlertDialog.Builder

開(kāi)發(fā)實(shí)踐:Retrofit&OkHttpClient的對(duì)象構(gòu)建


二、結(jié)構(gòu)型模式

共七種:代理模式、享元模式、適配器模式、裝飾器模式、外觀模式、橋接模式、組合模式。

適配器&外觀&裝飾者的區(qū)別:

??適配器模式的意圖:是改變接口以符合client的期望。

??外觀模式的意圖:是提供復(fù)雜子系統(tǒng)的一個(gè)簡(jiǎn)化接口,讓接口更簡(jiǎn)單。

??裝飾者模式的意圖:是不改變接口,但加入新的行為和責(zé)任。

6、代理模式:

Provide a surrogate or placeholder for another object to control access to it. 為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。

優(yōu)點(diǎn):代理類包裝了代理類,以控制對(duì)此對(duì)象的訪問(wèn);用戶不需要了解被代理類的技術(shù)實(shí)現(xiàn)細(xì)節(jié)。

java: ??java.lang.reflect.Proxy

android:

開(kāi)發(fā)實(shí)踐:所有的AIDL都一個(gè)代理模式的例子。假設(shè)一個(gè)Activity A去綁定一個(gè)Service S,那么A調(diào)用S中的每一個(gè)方法其實(shí)都是通過(guò)系統(tǒng)的Binder機(jī)制的中轉(zhuǎn),然后調(diào)用S中的對(duì)應(yīng)方法來(lái)做到的。Binder機(jī)制就起到了代理的作用。


7、享元模式:--比如Integer#valueOf()

Use sharing to support large numbers of fine-grained objects efficiently. 使用共享對(duì)象可有效地支持大量的細(xì)粒度對(duì)象。

優(yōu)點(diǎn):代理類包裝了代理類,以控制對(duì)此對(duì)象的訪問(wèn);用戶不需要了解被代理類的技術(shù)實(shí)現(xiàn)細(xì)節(jié)。

java:

??java.lang.reflect.Proxy

? java.lang.Integer#valueOf(int)

android:

Message.obtainMessage():通過(guò)重用Message對(duì)象來(lái)避免大量的Message對(duì)象被頻繁的創(chuàng)建和銷毀。

開(kāi)發(fā)實(shí)踐:#


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. 適配器將一個(gè)類的接口轉(zhuǎn)換成客戶端所期待的另一種接口,讓原本因?yàn)榻涌诓黄ヅ涠鵁o(wú)法在一起工作的兩個(gè)類能在一起工作。

優(yōu)點(diǎn):#

java:

android:

ListView或GridView的Adapter

TelecomAdapter (InCallUI->Telecom 之間apis轉(zhuǎn)換)

開(kāi)發(fā)實(shí)踐:#


9、裝飾者模式(Decorator?Pattern):

Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality. 動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。能夠在不修改任何底層代碼的情況下,給你的或別人的對(duì)象賦予新的職責(zé)。

優(yōu)點(diǎn):

a. 組件和裝飾者可以獨(dú)立發(fā)展,而不互相耦合;

b. 是繼承關(guān)系的一個(gè)替代方案。若使用繼承時(shí)子類非常多,會(huì)導(dǎo)致類爆炸,可用裝飾者模式。--使用組合而非繼承,可以在運(yùn)行時(shí)動(dòng)態(tài)地進(jìn)行擴(kuò)展;

c. 可以動(dòng)態(tài)地?cái)U(kuò)展一個(gè)實(shí)現(xiàn)類的功能。如要增加新的修飾條件,增加一個(gè)ConcreteDecorator即可。

缺點(diǎn):多層的裝飾是比較復(fù)雜。

java:

android:

ListView或GridView的Adapter

TelecomAdapter (InCallUI->Telecom 之間apis轉(zhuǎn)換)

開(kāi)發(fā)實(shí)踐:#


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)中的一組接口提供一個(gè)統(tǒng)一的入口。外觀模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。?

優(yōu)點(diǎn):

a. 簡(jiǎn)化了復(fù)雜的接口,客戶端只需與外觀交流,而無(wú)需知道具體的子系統(tǒng)組件;符合 迪米特法則(最少知識(shí)原則)。

b. 還將客戶從組件的子系統(tǒng)中解耦,例如若組件升級(jí),只需要修改外觀代碼即可,無(wú)需修改客戶端代碼。

java: #

android: #

開(kāi)發(fā)實(shí)踐:#


11、組合模式(Composite Pattern):--比如File(同時(shí)表示文件+文件夾 樹(shù)目錄結(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. 將對(duì)象組合成樹(shù)形結(jié)構(gòu)來(lái)表現(xiàn)“部分-整體”的層次結(jié)構(gòu),使客戶以一致的方式來(lái)處理單個(gè)(葉子節(jié)點(diǎn))對(duì)象和組合(樹(shù)枝節(jié)點(diǎn))對(duì)象。?

優(yōu)點(diǎn):

a. 葉子節(jié)點(diǎn)(單個(gè)對(duì)象)、樹(shù)枝節(jié)點(diǎn)(組合對(duì)象)對(duì)用戶透明;即可以將相同的操作應(yīng)用在組合對(duì)象和單個(gè)對(duì)象上。

b. 高層模塊調(diào)用簡(jiǎn)單;局部和整體對(duì)調(diào)用者來(lái)說(shuō)沒(méi)有任何區(qū)別。

c. 節(jié)點(diǎn)增加自由。

缺點(diǎn):組合模式以犧牲單一職責(zé)原則來(lái)?yè)Q取透明性:同一個(gè)節(jié)點(diǎn)既負(fù)責(zé)“組合方法”、又負(fù)責(zé)“操作方法”

java:

?java.util.Map#putAll(Map)

?java.util.List#addAll(Collection) ??

?java.util.Set#addAll(Collection)

android: #

開(kāi)發(fā)實(shí)踐:#


12、橋接模式(Bridge Pattern,橋梁模式):--比如JDBC驅(qū)動(dòng)器

Decouple an abstraction from its implementation so that the two can vary independently. 將抽象和實(shí)現(xiàn)解耦,使得兩者可以獨(dú)立的變化。

相關(guān)概念:

JDBC(Java?DataBase?Connectivity):是Java和數(shù)據(jù)庫(kù)之間的一個(gè)橋梁,是一個(gè)規(guī)范而不是一個(gè)實(shí)現(xiàn),能夠執(zhí)行SQL語(yǔ)句。它由一組用Java語(yǔ)言編寫的類和接口組成。各種不同類型的數(shù)據(jù)庫(kù)都有相應(yīng)的實(shí)現(xiàn)。

優(yōu)點(diǎn):

? 把抽象部分和具體部分分離開(kāi)來(lái),從而使得抽象部分和具體部分都可以獨(dú)立地?cái)U(kuò)展。

? 對(duì)于應(yīng)用程序而言,只要選用不同的驅(qū)動(dòng),就可以讓程序操作不同的數(shù)據(jù)庫(kù),而無(wú)需更改應(yīng)用程序,從而實(shí)現(xiàn)在不同的數(shù)據(jù)庫(kù)上移植;對(duì)于驅(qū)動(dòng)程序而言,為數(shù)據(jù)庫(kù)實(shí)現(xiàn)不同的驅(qū)動(dòng)程序,并不會(huì)影響應(yīng)用程序。

缺點(diǎn):組合模式以犧牲單一職責(zé)原則來(lái)?yè)Q取透明性:同一個(gè)節(jié)點(diǎn)既負(fù)責(zé)“組合方法”、又負(fù)責(zé)“操作方法”

java:

??AWT (提供了抽象層映射于實(shí)際的操作系統(tǒng))

?JDBC

android: #

開(kāi)發(fā)實(shí)踐:#


三、關(guān)系型模式

關(guān)系型模式,共十一種:狀態(tài)模式、命令模式、模板方法模式、迭代器模式、策略模式、觀察者模式、責(zé)任鏈模式、解釋器模式、備忘錄模式、訪問(wèn)者模式、中介者模式。

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)模式允許對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變其它的行為,對(duì)象看起來(lái)好像修改了它的類。

優(yōu)點(diǎn):

a. 結(jié)構(gòu)清晰;避免了過(guò)多的條件語(yǔ)句

b. 體現(xiàn)了開(kāi)閉原則、單一職責(zé)原則;每個(gè)狀態(tài)都是一個(gè)子類,增加狀態(tài)的話 只要增加一個(gè)子類即可。

c. 封裝性好;狀態(tài)的變換 放到類的內(nèi)部實(shí)現(xiàn)

缺點(diǎn):新增一個(gè)state時(shí),需要新增一個(gè)子類,state子類很多。

java: #

android:

View.onVisibilityChanged方法:就是提供了一個(gè)狀態(tài)模式的實(shí)現(xiàn),允許在View的visibility發(fā)生改變時(shí),引發(fā)執(zhí)行onVisibilityChanged方法中的動(dòng)作。(狀態(tài)發(fā)生改變時(shí),行為改變。)

開(kāi)發(fā)實(shí)踐:#


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.

將請(qǐng)求封裝成對(duì)象,以便使用不同的請(qǐng)求、隊(duì)列、或日志將客戶端參數(shù)化,同時(shí)提供可撤銷功能。

優(yōu)點(diǎn):

a. 解耦:Invoker和Receiver完全解耦,不需要直接溝通。Command對(duì)象中封裝了Receiver,及其要做的事情。

b. 可擴(kuò)展:日后增加新的Command子類,即可增加新功能。

c. 可結(jié)合其他模式,例如責(zé)任鏈模式、模板方法模式。

缺點(diǎn):Command子類可能會(huì)非常多。(可結(jié)合模板方法模式解決)

java:

??java.lang.Runnable

??javax.swing.Action

android: #

開(kāi)發(fā)實(shí)踐:#


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.?

模板方法模式在一個(gè)方法中定義一個(gè)算法的骨架,而將一些步驟的實(shí)現(xiàn)延遲到子類中。模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法中某些步驟的具體實(shí)現(xiàn)。

優(yōu)點(diǎn):#

缺點(diǎn):#

java:

?java.io.InputStream|OutputStream|Reader|Writer的所有非抽象方法(算法骨架)

?java.util.AbstractList|AbstractSet|AbstractMap的所有非抽象方法(算法骨架)

android: #

開(kāi)發(fā)實(shí)踐:#


16、迭代器模式(Iterator Pattern)--比如自定義遍歷容器 implements?Iterator

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

迭代器模式提供了一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中的各個(gè)元素,而又不暴露該對(duì)象的內(nèi)部表示。

優(yōu)點(diǎn):#

缺點(diǎn):#

java:

??java.util.Iterator

??java.util.Enumeration

android: #

開(kāi)發(fā)實(shí)踐:

迭代器使用規(guī)則:

??自行實(shí)現(xiàn)可遍歷容器時(shí):建議只implements?Iterator(實(shí)現(xiàn)Collection則代碼邏輯較復(fù)雜);

??使用Java內(nèi)置容器時(shí):建議針對(duì)Collection接口編程。


17、策略模式(Strategy Pattern)

--比如:依賴注入場(chǎng)景(舉例:自行實(shí)現(xiàn)Comparator.compare()比較策略,再調(diào)用容器.sort()算法實(shí)現(xiàn)定制排序)

Define a family of algorithms,encapsulate each one,and make them interchangeable.

定義一組算法,將每個(gè)算法都封裝起來(lái),并且使它們之間可以互換。

優(yōu)點(diǎn):#

缺點(diǎn):#

java:

??java.util.Comparator#compare()

??Java.util.List:

定義了增(add)、刪(remove)、改(set)、查(indexOf)策略,至于實(shí)現(xiàn)這個(gè)策略的ArrayList、LinkedList等類,只是在具體實(shí)現(xiàn)時(shí)采用了不同的算法。但因?yàn)樗鼈儾呗砸粯樱豢紤]速度的情況下,使用時(shí)完全可以互相替換使用。

android: #


18、觀察者模式(Observer Pattern)--比如:--注冊(cè)&注銷監(jiān)聽(tīng)

Define a one-to-many dependency between objects so that when one object changes state,all itsdependents are notified and updated automatically。定義對(duì)象間一種一對(duì)多的依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴于它的對(duì)象都會(huì)得到通知并被自動(dòng)更新。

觀察者模式是對(duì)象的行為模式,又叫發(fā)布-訂閱(publish/subscribe)模式,模型-視圖(moder/view)模式,源-監(jiān)聽(tīng)器(source/listener)模式或從屬者(dependent)模式。

相關(guān)概念:監(jiān)聽(tīng)Listener&回調(diào)Callback的區(qū)別:

?監(jiān)聽(tīng)Listener:動(dòng)態(tài)注冊(cè)addListener() & removeListener(),維護(hù)監(jiān)聽(tīng)ArrayList數(shù)組或列表。

?回調(diào)Callback:方法調(diào)用時(shí),傳入callback para,由執(zhí)行方?jīng)Q定callback的觸發(fā)條件。

優(yōu)點(diǎn):#

缺點(diǎn):#

java: #

android:#


19、責(zé)任鏈模式(Chain of Responsibility?Pattern)--比如:AI語(yǔ)義識(shí)別(采用多個(gè)場(chǎng)景parse過(guò)濾鏈機(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.

使多個(gè)對(duì)象有機(jī)會(huì)處理請(qǐng)求,從而避免了請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系 。將這些對(duì)象連成一個(gè)鏈,并沿著這條鏈傳遞請(qǐng)求,直到有對(duì)象處理它為止。

優(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ǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來(lái)解釋語(yǔ)言中的句子。

優(yōu)點(diǎn):#

缺點(diǎn):不要在for循環(huán)中使用到備忘錄模式,會(huì)產(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.

在不破壞封裝的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài),這樣以后就可將該對(duì)象恢復(fù)到原來(lái)保存的狀態(tài)。

優(yōu)點(diǎn):#

缺點(diǎn):不要在for循環(huán)中使用到備忘錄模式,會(huì)產(chǎn)生大量的數(shù)據(jù)。

java:

?java.util.Date

?java.io.Serializable

?javax.faces.component.StateHolder

android:

?Parcelable


22、訪問(wèn)者模式(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.

用一個(gè)中介對(duì)象封裝一系列的對(duì)象交互,中介者使各對(duì)象不需要顯示的相互作用,從而使其耦合松散,而且可以獨(dú)立的改變它們之間的交互。

優(yōu)點(diǎn):中介者讓各個(gè)系統(tǒng)之間可以獨(dú)立,同時(shí)又可以交互。

缺點(diǎn):#

java: #

android:#

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容