桥接
让抽象与实现独立变化。
结构型
说明
两个变化维度会交叉组合时,用接口连接,避免为每个组合建子类。
分析
Page 表示要展示的内容,Renderer 决定如何渲染;两者可以分别增加新类型。需要文本和 HTML、终端等多种输出组合时,这比为每个组合创建独立类型更容易维护。
Page 拥有内容,Renderer 拥有输出方式,两者通过组合连接。增加文本渲染器不必为每个页面再造一个类型;只有一个固定输出时,直接函数可能更简单。当前 HTML 实现直接拼接字符串,真实用户文本需要上下文转义或模板库,桥接本身不提供输出安全。
查看图表代码
适用前提与边界
接口边界应放在真正会独立变化的能力上。 只有接口适配或独立变化确实存在时,才增加额外包装层。
示例输入与调用
go
page := Page{Renderer: HTML{}, Text: "Hello"}
fmt.Println(page.Show())运行输出
text
<p>Hello</p>完整 Go 示例
go
package main
import "fmt"
type Renderer interface{ Render(string) string }
type HTML struct{}
func (HTML) Render(s string) string {
return "<p>" + s + "</p>"
}
type Page struct {
Renderer Renderer
Text string
}
func (p Page) Show() string {
return p.Renderer.Render(p.Text)
}
func main() {
page := Page{Renderer: HTML{}, Text: "Hello"}
fmt.Println(page.Show())
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任