前言
Android的設(shè)計(jì)模式系列文章介紹影斑,歡迎關(guān)注蹂析,持續(xù)更新中:
Android的設(shè)計(jì)模式-設(shè)計(jì)模式的六大原則
一句話總結(jié)23種設(shè)計(jì)模式則
創(chuàng)建型模式:
Android的設(shè)計(jì)模式-單例模式
Android的設(shè)計(jì)模式-建造者模式
Android的設(shè)計(jì)模式-工廠方法模式
Android的設(shè)計(jì)模式-簡單工廠模式
Android的設(shè)計(jì)模式-抽象工廠模式
Android的設(shè)計(jì)模式-原型模式
行為型模式:
Android的設(shè)計(jì)模式-策略模式
Android的設(shè)計(jì)模式-狀態(tài)模式
Android的設(shè)計(jì)模式-責(zé)任鏈模式
Android的設(shè)計(jì)模式-觀察者模式
Android的設(shè)計(jì)模式-模板方法模式
Android的設(shè)計(jì)模式-迭代器模式
Android的設(shè)計(jì)模式-備忘錄模式
Android的設(shè)計(jì)模式-訪問者模式
Android的設(shè)計(jì)模式-中介者模式
Android的設(shè)計(jì)模式-解釋器模式
Android的設(shè)計(jì)模式-命令模式
結(jié)構(gòu)型模式:
Android的設(shè)計(jì)模式-代理模式
Android的設(shè)計(jì)模式-組合模式
Android的設(shè)計(jì)模式-適配器模式
Android的設(shè)計(jì)模式-裝飾者模式
Android的設(shè)計(jì)模式-享元模式
Android的設(shè)計(jì)模式-外觀模式
Android的設(shè)計(jì)模式-橋接模式
1.定義
將抽象部分與實(shí)現(xiàn)部分分離敛助,使它們都可以獨(dú)立的變化沦零。
2.介紹
- 橋接模式屬于結(jié)構(gòu)型模式耻台。
- 舉個(gè)生活中的例子藏古,一條數(shù)據(jù)線玄捕,一頭USB接口的可以連接電腦睦刃、充電寶等等,另一頭可以連接不同品牌的手機(jī)檬输,通過這條數(shù)據(jù)線照瘾,兩頭不同的東西就可以連接起來,這就是橋接模式丧慈。
3.UML類圖
角色說明:
- Abstraction(抽象化角色):一般是抽象類析命,定義該角色的行為,同時(shí)保存一個(gè)對(duì)實(shí)現(xiàn)化角色的引用逃默。
- Implementor(實(shí)現(xiàn)化角色):接口或者抽象類鹃愤,定義角色必需的行為和屬性。
- ConcreteImplementorA完域、ConcreteImplementorB(具體實(shí)現(xiàn)化角色):實(shí)現(xiàn)角色的具體行為软吐。
4.實(shí)現(xiàn)
這里以穿衣服為例,不同職業(yè)的人可能要穿的衣服不一樣吟税。
4.1 創(chuàng)建實(shí)現(xiàn)化角色
定義一個(gè)衣服接口:
interface Clothes {
String getName();
}
4.2 創(chuàng)建具體實(shí)現(xiàn)化角色
創(chuàng)建兩種衣服類:校服和襯衫凹耙。
public class Uniform implements Clothes {
@Override
public String getName() {
return "校服";
}
}
public class Shirt implements Clothes {
@Override
public String getName() {
return "襯衫";
}
}
4.3 創(chuàng)建抽象化角色
定義一個(gè)人物類,有一個(gè)穿衣服的方法肠仪,并且持有衣服類的引用肖抱。即抽象化角色持有實(shí)現(xiàn)化角色的引用,可以調(diào)用實(shí)現(xiàn)化角色的方法异旧,達(dá)到橋接的作用意述。
public abstract class Person {
Clothes mClothes;//持有衣服類的引用
public void setClothes(Clothes clothes) {
mClothes = clothes;
}
protected abstract void dress();//穿衣服
}
4.4 創(chuàng)建具體抽象化角色
這里有兩種角色穿衣服:學(xué)生和程序員。
public class Student extends Person {
@Override
protected void dress() {
System.out.println("學(xué)生穿上" + mClothes.getName());
}
}
public class Coder extends Person {
@Override
protected void dress() {
System.out.println("程序員穿上" + mClothes.getName());
}
}
4.5 客戶端測(cè)試:
public void test() {
//創(chuàng)建各種衣服對(duì)象
Clothes uniform = new Uniform();
Clothes shirt = new Shirt();
//不同職業(yè)的人穿衣服
Person coder = new Coder();
coder.setClothes(shirt);
coder.dress();
System.out.println("--------------------------------------");
Person student = new Student();
student.setClothes(uniform);
student.dress();
System.out.println("--------------------------------------");
student.setClothes(shirt);
student.dress();
}
輸出結(jié)果:
程序員穿上襯衫
--------------------------------------
學(xué)生穿上校服
--------------------------------------
學(xué)生穿上襯衫
4.6 其他說明:
通過上面的例子可以看到吮蛹,我們分離了兩端的變化荤崇。新增衣服和新增職業(yè)都變的非常簡單。假如我們?cè)僭鲆粋€(gè)維度的變化潮针,例如加個(gè)年齡來區(qū)分怎么辦天试?這時(shí)我們就可以把Person
類作為實(shí)現(xiàn)化角色,把不同年齡段作為抽象化角色然低,代碼就不寫了喜每,有興趣可以去實(shí)現(xiàn)一下。
5. 應(yīng)用場(chǎng)景
- 一個(gè)類存在兩個(gè)或以上的獨(dú)立維度的變化雳攘,且這些維度都需要進(jìn)行拓展带兜。
- 不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致類的個(gè)數(shù)急劇增加時(shí)。
- 如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性吨灭,避免在兩個(gè)層次之間建立靜態(tài)的繼承關(guān)系刚照,可以通過橋接模式使他們?cè)诔橄髮咏⒁粋€(gè)關(guān)聯(lián)關(guān)系。
6. 優(yōu)點(diǎn)
- 分離了抽象與實(shí)現(xiàn)喧兄。讓抽象部分和實(shí)現(xiàn)部分獨(dú)立開來无畔,分別定義接口啊楚,這有助于對(duì)系統(tǒng)進(jìn)行分層,從而產(chǎn)生更好的結(jié)構(gòu)化的系統(tǒng)浑彰。
- 良好的擴(kuò)展性恭理。抽象部分和實(shí)現(xiàn)部分都可以分別獨(dú)立擴(kuò)展,不會(huì)相互影響郭变。
7. 缺點(diǎn)
- 增加了系統(tǒng)的復(fù)雜性颜价。
- 不容易設(shè)計(jì),抽象與實(shí)現(xiàn)的分離要設(shè)計(jì)得好比較有難度诉濒。
8. Android中的源碼分析
橋接模式在Android中的源碼應(yīng)用還是非常廣泛的周伦。比如AbsListView
跟ListAdapter
之間就是一個(gè)橋接模式。
8.1 AbsListView 與 ListAdapter 之間的橋接模式
相關(guān)代碼就不貼了未荒,看下它們的UML類圖就明白了专挪。
這里AbsListView是抽象化角色,ListAdapter則是實(shí)現(xiàn)化角色片排。
8.2 其他
另外寨腔,Window
與 WindowManager
之間也是橋接模式。有興趣的可以去看下源碼體會(huì)體會(huì)划纽。
相關(guān)文章閱讀
Android的設(shè)計(jì)模式-設(shè)計(jì)模式的六大原則
一句話總結(jié)23種設(shè)計(jì)模式則
創(chuàng)建型模式:
Android的設(shè)計(jì)模式-單例模式
Android的設(shè)計(jì)模式-建造者模式
Android的設(shè)計(jì)模式-工廠方法模式
Android的設(shè)計(jì)模式-簡單工廠模式
Android的設(shè)計(jì)模式-抽象工廠模式
Android的設(shè)計(jì)模式-原型模式
行為型模式:
Android的設(shè)計(jì)模式-策略模式
Android的設(shè)計(jì)模式-狀態(tài)模式
Android的設(shè)計(jì)模式-責(zé)任鏈模式
Android的設(shè)計(jì)模式-觀察者模式
Android的設(shè)計(jì)模式-模板方法模式
Android的設(shè)計(jì)模式-迭代器模式
Android的設(shè)計(jì)模式-備忘錄模式
Android的設(shè)計(jì)模式-訪問者模式
Android的設(shè)計(jì)模式-中介者模式
Android的設(shè)計(jì)模式-解釋器模式
Android的設(shè)計(jì)模式-命令模式
結(jié)構(gòu)型模式:
Android的設(shè)計(jì)模式-代理模式
Android的設(shè)計(jì)模式-組合模式
Android的設(shè)計(jì)模式-適配器模式
Android的設(shè)計(jì)模式-裝飾者模式
Android的設(shè)計(jì)模式-享元模式
Android的設(shè)計(jì)模式-外觀模式
Android的設(shè)計(jì)模式-橋接模式