定义
将抽象部分和实现部分分离,使它们都可以独立地变化。
简介
- 桥接模式属于结构性模式
- 通俗的表达:举个例子,一条数据线,一头USB接口的可以连接电脑、充电宝等等,另一头可以连接不同品牌的手机,通过这条数据线,两头不同的东西就可以连接起来,这就是桥接模式。
代码实例
背景:不同职业的人(Person),他们的穿衣(Clothes)需求不同。比如,学生(Student)会穿校服(Uniform)和衬衫(Shirt),程序员会穿衬衫……
package 设计模式4
/**
*@Description
*@Author PC
*@QQ 1578684787
*/
/**
* 创建实现化角色
* 定义接口:穿衣服
*/
interface Clothes{
fun getName():String
}
/**
* 创建具体实现化角色
*/
class Uniform:Clothes{
override fun getName(): String {
return "校服"
}
}
class Shirt:Clothes{
override fun getName(): String {
return "衬衫"
}
}
/**
* 创建一个人物类,有一个穿衣服的方法,并且持有衣服类的引用。
* 也就是抽象化角色持有实例化角色的引用,可以调用实例化角色的方法,达到桥接的作用。
*/
abstract class Person(){
lateinit var mClothes:Clothes //持有衣服类的引用
fun setClothes(clothes: Clothes){
mClothes = clothes
}
abstract fun dress()//穿衣服
}
/**
* 创建具体抽象化角色
*/
class Student:Person(){
override fun dress() {
println("学生穿上"+mClothes.getName() )
}
}
class Coder:Person(){
override fun dress() {
println("程序员穿上"+mClothes.getName() )
}
}
/**
* 测试
*/
fun main() {
//创建不同的衣服对象
val uniform:Clothes = Uniform()
val shirt:Clothes = Shirt()
//不同职业的人穿衣服
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()
}
运行结果:
测试结果优点
- 分离了抽象与实现。让抽象部分和实现部分分离开,分别定义接口,这有助于对系统进行分层,从而产生更好的结构化的系统。
- 良好的扩展性。抽象部分和实现部分都可以分别独立扩展,而不相影响。
缺点
- 增加了系统的复杂性。
- 不容易设计。抽象与现实的分离要设计的好比较有难度。
应用场景
在Android的系统中,AbsListView跟ListAdapter之间就是使用的桥接模式。
Window和WindowManager之间也使用了桥接模式。
- 一个类存在两个或以上的独立维度的变化,且这些维度都需要进行扩展。
- 不希望使用继承或多层次继承导致类的个数急剧增加时。
- 如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,可以通过桥接模式使它们在首相层建立一个关联关系。
参考文章:
Android设计模式-桥接模式
网友评论