【Go-设计模式】桥接模式 详解

概念:
桥接模式分离 抽象部分 和 实现部分,
将实现与抽象放在 两个不同的类层次 中,使两个层次可以 独立改变
Bridge 模式基于 类的最小设计原则,通过使用 封装、聚合 及 继承 等行为 让 不同的类 承担 不同的职责
它的 主要特点 是把 抽象(Abstraction) 与 行为实现(Implementation) 分离开来,从而可以保持 各部分的独立性 以及 应对他们的功能扩展

UML:

- Abstraction:
抽象化角色,抽象化 给出的 定义,并 保存 一个对 实现化对象 的 引用 - RefinedAbstraction:
修正抽象化角色,扩展抽象化角色,改变 和 修正 父类对 抽象化的定义 - Implementor:
实现化角色,这个角色给出 具体角色的接口,
但是 不给出具体的实现,这个接口不一定和抽象化角色的接口定义相同,实际上两者可以完全不一样,好比形状的颜色接口。 - ConcreteImplementorA/B:
具体实现化角色,这个角色给出 实现化角色接口 的 具体实现
示例:
- 电脑的类型(台式 or 笔记本) 是 抽象部分,保留对 实现化部分 的引用
- 电脑特征(运行效率 and 源码) 是 实现部分
- Mac/Windows 是 具体的实现化角色
抽象 功能接口:
type Computer interface {
DescPerformance() string
}
具体的 抽象实现类:
抽象实现类1:
type Desktop struct {
brand Brand
}
func (this Desktop) DescPerformance() string {
return "【Desktop】the source code is " + this.brand.Source() + ", it is running "
}
func NewDesktop(brand Brand) *Desktop {
return &Desktop{
brand: brand,
}
}
抽象实现类2:
type Notebook struct {
brand Brand
}
func (this Notebook) DescPerformance() string {
return "【Notebook】the source code is " + this.brand.Source() + ", it is running "
}
func NewNotebook(brand Brand) *Notebook {
return &Notebook{
brand: brand,
}
}
行为接口:
type Brand interface {
Work() string
Source() string
}
具体行为 实现类:
具体行为 实现类1:
type Mac struct {
}
func (this Mac) Work() string {
return "【Mac】so fast"
}
func (this Mac) Source() string {
return "【Mac】open source"
}
具体行为 实现类2:
type Windows struct {
}
func (this Windows) Work() string {
return "【Windows】so bad"
}
func (this Windows) Source() string {
return "【Windows】close source"
}
测试:
package main
import (
"DemoProject/design/base23/bridge" // 根据自己的项目路径定制
"fmt"
)
func testMakeMacDesktop() *bridge.Desktop {
return bridge.NewDesktop(bridge.Mac{})
}
func testMakeWindowsDesktop() *bridge.Desktop {
return bridge.NewDesktop(bridge.Windows{})
}
func testMakeMacNotebook() *bridge.Notebook {
return bridge.NewNotebook(bridge.Mac{})
}
func testMakeWindowsNotebook() *bridge.Notebook {
return bridge.NewNotebook(bridge.Windows{})
}
func main() {
// bridge
macDesktop := testMakeMacDesktop()
fmt.Println(macDesktop.DescPerformance())
windowsDesktop := testMakeWindowsDesktop()
fmt.Println(windowsDesktop.DescPerformance())
macNotebook := testMakeMacNotebook()
fmt.Println(macNotebook.DescPerformance())
windowsNotebook := testMakeWindowsNotebook()
fmt.Println(windowsNotebook.DescPerformance())
}
注意事项:
实现了 抽象 和 实现部分 的分离,从而极大地提升了 系统的灵活性,让 抽象部分 和 实现部分 独立开来,这有助于系统进行 分层设计,从而产生更好的 结构化系统
对于 系统的高层部分,只需要知道 抽象部分 和 实现部分 的接口就可以了,其它的部分由 具体业务 来完成
桥接模式 替代 多层继承方案,可以 减少子类个数,降低系统的 管理和维护成本
桥接模式 的 引入增加了系统的 理解和设计难度,由于 聚合关联关系 建立在抽象层,要求开发者针对 抽象 进行设计和编程
桥接模式 要求 正确识别出 系统中两个独立变化的维度(抽象 和 实现),因此其使用范围有一定的 局限性,即需要有这样的 应用场景。
对于那些 不希望使用继承 或 因为 多层次继承 导致 系统类的个数急剧增加 的系统,桥接模式尤为适用

浙公网安备 33010602011771号