桥接模式
GitHub代码链接
Bridge Pattern用于把抽象是实现分离。使得二者可以独立变化。
什么是桥接模式
这种模式涉及到一个作为桥的接口,使得实体类的功能独立于接口实现类。
解决了什么问题
在多种可能会变化的情况下,用继承会造成类爆炸,扩展起来不灵活。我们把多角度的类分离出来,
让他们独立变化,减少它们之间的耦合。
优点
1.在多种可能变化的情况下,使用继承可能造成类特别多。桥接可以解决这个问题。
2.优秀的拓展能力
缺点
1.桥接模式会增加系统的理解和设计难度
代码实现
我们使用DrawAPI
作为桥接模式的抽象接口,ShapeCirlce
作为桥接模式的实体类。将抽象接口保存在实体类中,使得抽象接口实例变化时,ShapeCircle可以始终不变。
1.1 DrawAPI抽象接口定义
//DrawAPI 画图抽象接口,桥接模式的抽象接口
type DrawAPI interface {
DrawCircle(radius, x, y int)
}
1.2 实现DrawAPI抽象接口类
//RedCircle 红色圆的类,桥接模式接口
type RedCircle struct{}
//NewRedCircle 实例化红色圆
func NewRedCircle() *RedCircle {
return &RedCircle{}
}
//DrawCircle 红色圆实现DrawAPI方法
func (rc *RedCircle) DrawCircle(radius, x, y int) {
fmt.Printf("Drawing Circle[ color: red, radius: %d, x: %d, y: %d ]\n", radius, x, y)
}
1.3 ShapeCircle实体类实现
//ShapeCircle 桥接模式的实体类
type ShapeCircle struct {
Radius int
X int
Y int
drawAPI DrawAPI
}
//NewShapeCircle 实例化桥接模式实体类
func NewShapeCircle(radius, x, y int, drawAPI DrawAPI) *ShapeCircle {
return &ShapeCircle{
Radius: radius,
X: x,
Y: y,
drawAPI: drawAPI,
}
}
//Draw 实体类的Draw方法
func (sc *ShapeCircle) Draw() {
sc.drawAPI.DrawCircle(sc.Radius, sc.X, sc.Y)
}
有疑问加站长微信联系(非本文作者)