-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbridge.go
100 lines (85 loc) · 2.1 KB
/
bridge.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package pattern
import "fmt"
/*
模式名称:桥接模式
目的(What):将抽象部分与实现部分分离,使它们都可以独立的变化
解决的问题(Why):在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。当实现系统可能有多个角度分类(多个抽象类),每一种角度会有不同的变化。
解决方案(How):把每个角度的分类分离出来,让它们独立变化,减少它们之间的耦合
解决效果:
优点:
抽象和实现的分离
优秀的扩展能力
实现细节对客户透明
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系(桥接)建立在抽象层,要求开发者针对抽象进行设计与编程
*/
type car interface {
name() string
run()
}
type MercedesBenz struct {
}
func (m MercedesBenz) name() string {
return "Mercedes Benz"
}
func (m MercedesBenz) run() {
fmt.Println("benz running")
}
type Audi struct {
}
func (a Audi) name() string {
return "Audi"
}
func (a Audi) run() {
fmt.Println("audi running")
}
type shiftMode interface {
up()
down()
}
type Manual struct {
car car
}
func (m Manual) up() {
fmt.Printf("Manual up the %s car\n", m.car.name())
m.car.run()
}
func (m Manual) down() {
fmt.Printf("Manual down the %s car\n", m.car.name())
m.car.run()
}
func getNewManualShift(c car) *Manual {
return &Manual{car: c}
}
type Automatic struct {
car car
}
func (a Automatic) up() {
fmt.Printf("Automatic up the %s car\n", a.car.name())
a.car.run()
}
func (a Automatic) down() {
fmt.Printf("Automatic down the %s car\n", a.car.name())
a.car.run()
}
func getNewAutoShift(c car) *Automatic {
return &Automatic{car: c}
}
func TestBridge() {
ma := getNewAutoShift(&MercedesBenz{})
mm := getNewManualShift(&MercedesBenz{})
aa := getNewAutoShift(&Audi{})
am := getNewManualShift(&Audi{})
ma.up()
ma.down()
println("+++++++++++++++++++++++++")
mm.up()
mm.down()
println("+++++++++++++++++++++++++")
aa.up()
aa.down()
println("+++++++++++++++++++++++++")
am.up()
am.down()
println("+++++++++++++++++++++++++")
}