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

shadowLogo

概念:

桥接模式分离 抽象部分实现部分
将实现与抽象放在 两个不同的类层次 中,使两个层次可以 独立改变

Bridge 模式基于 类的最小设计原则,通过使用 封装聚合继承 等行为 让 不同的类 承担 不同的职责

它的 主要特点 是把 抽象(Abstraction)行为实现(Implementation) 分离开来,从而可以保持 各部分的独立性 以及 应对他们的功能扩展

bridge


UML:

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())
}

注意事项:

实现了 抽象实现部分 的分离,从而极大地提升了 系统的灵活性,让 抽象部分实现部分 独立开来,这有助于系统进行 分层设计,从而产生更好的 结构化系统

对于 系统的高层部分,只需要知道 抽象部分实现部分 的接口就可以了,其它的部分由 具体业务 来完成

桥接模式 替代 多层继承方案,可以 减少子类个数,降低系统的 管理和维护成本

桥接模式 的 引入增加了系统的 理解和设计难度,由于 聚合关联关系 建立在抽象层,要求开发者针对 抽象 进行设计和编程

桥接模式 要求 正确识别出 系统中两个独立变化的维度(抽象 和 实现),因此其使用范围有一定的 局限性,即需要有这样的 应用场景

对于那些 不希望使用继承 或 因为 多层次继承 导致 系统类的个数急剧增加 的系统,桥接模式尤为适用

posted @ 2021-12-13 09:06  在下右转,有何贵干  阅读(94)  评论(0)    收藏  举报