定義
將抽象部分和實現(xiàn)部分分離,使它們都可以獨立地變化。
簡介
- 橋接模式屬于結(jié)構(gòu)性模式
- 通俗的表達(dá):舉個例子,一條數(shù)據(jù)線,一頭USB接口的可以連接電腦、充電寶等等,另一頭可以連接不同品牌的手機(jī),通過這條數(shù)據(jù)線,兩頭不同的東西就可以連接起來,這就是橋接模式。
代碼實例
背景:不同職業(yè)的人(Person),他們的穿衣(Clothes)需求不同。比如,學(xué)生(Student)會穿校服(Uniform)和襯衫(Shirt),程序員會穿襯衫……
package 設(shè)計模式4
/**
*@Description
*@Author PC
*@QQ 1578684787
*/
/**
* 創(chuàng)建實現(xiàn)化角色
* 定義接口:穿衣服
*/
interface Clothes{
fun getName():String
}
/**
* 創(chuàng)建具體實現(xiàn)化角色
*/
class Uniform:Clothes{
override fun getName(): String {
return "校服"
}
}
class Shirt:Clothes{
override fun getName(): String {
return "襯衫"
}
}
/**
* 創(chuàng)建一個人物類,有一個穿衣服的方法,并且持有衣服類的引用。
* 也就是抽象化角色持有實例化角色的引用,可以調(diào)用實例化角色的方法,達(dá)到橋接的作用。
*/
abstract class Person(){
lateinit var mClothes:Clothes //持有衣服類的引用
fun setClothes(clothes: Clothes){
mClothes = clothes
}
abstract fun dress()//穿衣服
}
/**
* 創(chuàng)建具體抽象化角色
*/
class Student:Person(){
override fun dress() {
println("學(xué)生穿上"+mClothes.getName() )
}
}
class Coder:Person(){
override fun dress() {
println("程序員穿上"+mClothes.getName() )
}
}
/**
* 測試
*/
fun main() {
//創(chuàng)建不同的衣服對象
val uniform:Clothes = Uniform()
val shirt:Clothes = Shirt()
//不同職業(yè)的人穿衣服
val code:Person = Coder()
code.setClothes(shirt)
code.dress()
println("-------------------")
val student:Student = Student()
student.setClothes(uniform)
student.dress()
println("-------------------")
student.setClothes(shirt)
student.dress()
}
運行結(jié)果:

測試結(jié)果
優(yōu)點
- 分離了抽象與實現(xiàn)。讓抽象部分和實現(xiàn)部分分離開,分別定義接口,這有助于對系統(tǒng)進(jìn)行分層,從而產(chǎn)生更好的結(jié)構(gòu)化的系統(tǒng)。
- 良好的擴(kuò)展性。抽象部分和實現(xiàn)部分都可以分別獨立擴(kuò)展,而不相影響。
缺點
- 增加了系統(tǒng)的復(fù)雜性。
- 不容易設(shè)計。抽象與現(xiàn)實的分離要設(shè)計的好比較有難度。
應(yīng)用場景
在Android的系統(tǒng)中,AbsListView跟ListAdapter之間就是使用的橋接模式。
Window和WindowManager之間也使用了橋接模式。
- 一個類存在兩個或以上的獨立維度的變化,且這些維度都需要進(jìn)行擴(kuò)展。
- 不希望使用繼承或多層次繼承導(dǎo)致類的個數(shù)急劇增加時。
- 如果一個系統(tǒng)需要在構(gòu)建的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態(tài)的繼承關(guān)系,可以通過橋接模式使它們在首相層建立一個關(guān)聯(lián)關(guān)系。
參考文章:
Android設(shè)計模式-橋接模式