模式定义
将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。
类图
应用场景
在业务功能具有抽象功能和差异实现时需要独立的适应后面可能遇到的变化时使用桥接模式
优点
1.符合开闭原则
2.提供方法但是隐藏底层具体实现
3.将功能和实现分离开来,有利于解耦
要点总结
- Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化,所谓抽象和实现沿着各自维度的变化,即“子类化”它们
- Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了单一职责原则,复用性比较差,Bridge模式是比多继承方案更好的解决方法。
- Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类也有多于两个维度的变化,这时可以使用Bridge的扩展模式。
Go语言代码实现
举个例子,假设我们正在开发一个图形绘制应用程序,需要绘制不同的图形(如圆形、矩形、三角形)并选择不同的颜色(如红色、绿色、蓝色)进行填充。这里抽象部分是图形和颜色,实现部分是具体的图形类和颜色类。我们可以使用桥接模式来将抽象部分和实现部分解耦,使得可以自由组合不同的图形和颜色。
下面是通过 Golang 实现的简单示例:
package main
import "fmt"
// 抽象部分 - 图形
type Shape interface {
Draw(color Color)
}
// 实现部分 - 颜色
type Color interface {
Fill()
}
// 具体图形 - 圆形
type Circle struct{}
func (c *Circle) Draw(color Color) {
fmt.Print("绘制圆形,")
color.Fill()
}
// 具体图形 - 矩形
type Rectangle struct{}
func (r *Rectangle) Draw(color Color) {
fmt.Print("绘制矩形,")
color.Fill()
}
// 具体图形 - 三角形
type Triangle struct{}
func (t *Triangle) Draw(color Color) {
fmt.Print("绘制三角形,")
color.Fill()
}
// 具体颜色 - 红色
type Red struct{}
func (r *Red) Fill() {
fmt.Println("使用红色填充")
}
// 具体颜色 - 绿色
type Green struct{}
func (g *Green) Fill() {
fmt.Println("使用绿色填充")
}
// 具体颜色 - 蓝色
type Blue struct{}
func (b *Blue) Fill() {
fmt.Println("使用蓝色填充")
}
func main() {
// 创建具体图形和颜色对象
circle := &Circle{}
rectangle := &Rectangle{}
triangle := &Triangle{}
red := &Red{}
green := &Green{}
blue := &Blue{}
// 绘制不同图形并填充不同颜色
circle.Draw(red)
rectangle.Draw(green)
triangle.Draw(blue)
}
在上述示例中,我们定义了抽象部分 Shape 和实现部分 Color。具体图形类 Circle、Rectangle、Triangle 实现了 Shape 接口,具体颜色类 Red、Green、Blue 实现了 Color 接口。通过组合不同的图形和颜色,可以实现不同的组合,而不需要修改抽象和实现部分的代码。
通过桥接设计模式,我们实现了图形和颜色之间的组合关系。