Skip to content

Latest commit

 

History

History
79 lines (53 loc) · 3.54 KB

File metadata and controls

79 lines (53 loc) · 3.54 KB

桥接模式

定义

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式, 又称为柄体(Handle and Body)模式或接口(Interface) 模式。

Bridge的意思就是“桥梁”, 好比现实生活中的桥梁, 它的存在就是将河流两侧东西给连接起来,应用到软件里面Bridge就是将类的功能层次结构与实现层次结构连接起来。

UML类图

桥接模式中包含了几种角色,分别是:

●抽象化(Abstraction) :该角色位于属于"类的功能层次结构” 的最上层,用于定义抽象接口,一般是抽象类而不是抽象接口。其内部往往包含一个实现类接口实例(Implementor),使用委托方式进行内部调用;

●改善后的抽象化,或者叫补充抽象类(RefinedAbstraction) :该角色用于补充 Abstraction功能而存在,通常情况下不再是抽象类而是具体的实现类,在内部可以直接调用Implementor中的业务方法;

●实现者(Implementor) :该角色位于"类的实现层次结构” 的最上层,定义了用于实现Abstraction角色的接口(API) ,这里的接口并非要和Abstraction中定义的完全一致,Implementor只对这些接口进行声明,具体实现还是要交给子类。通过委托,在 Abstraction中,不仅可以调用自己方法,还可以调用到Implementor中定义的方法;

●具体实现者(Concretelmplementor) :该角色用于实现Implementor角色中定义的接口,不同的实现类提供不同的业务处理方法,程序运行时,Concretelmplementor 将替换Abstraction中的Implementor,提供给抽象类具体的业务操作方法。

实例

我们的手机上都安装了各种各样的软件,我们如何表示“在手机上运行软件”这一活动?手机的品牌和软件是两个维度上的东西,我们将其类比成功能层级和实现层级。类图如下

测试方法

package StructuralType

import "testing"

func TestMobilePhone_Run(t *testing.T) {
	h1 := HuaWei{MobilePhone{ChatSoft{}}}
	h2 := HuaWei{MobilePhone{GameSoft{}}}
	h1.Run()
	h2.Run()
	h2.GPUTurbo()
	m1 := XiaoMi{MobilePhone{ChatSoft{}}}
	m2 := XiaoMi{MobilePhone{GameSoft{}}}
	m1.Run()
	m2.Run()
	m2.GameTurbo()
}

测试结果

=== RUN   TestMobilePhone_Run
聊天软件启动
游戏软件启动
GPUTurbo started
聊天软件启动
游戏软件启动
GameTurbo started.
--- PASS: TestMobilePhone_Run (0.00s)
PASS

由于m1、m2都属于MobilePhoneAbstraction的类的实例,因此我们可以调用它们的run方法,而m1、m2又都属于HuaWeiMobilePhone的实例,所以我们还能调用其gpuTurborRun方法,比如后期我们run实现有所变动,那么只需要修改main方法和Softlmplementor的实现类即可,其它代码就可以保持不动了。

通过MobilePhoneAbstraction中的impl桥接,就实现了抽象与行为实现的分离,这种就是桥接模式的存在意义。

优缺点

桥接模式的优缺点总结如下: ●抽象与实现相分离:抽象与实现相分离,从而让抽象与实现分别独立开来,分别定义接口,有助于系统分层及产生更好的结构化系统;

●更好的拓展性:系统拓展时,因为抽象与实现已经分别独立,所以可以进行分别拓展不会相互影响,从而大大提高系统拓展性。

总结