Skip to content

Commit d5f4abd

Browse files
committed
add bridge mode
1 parent 295fc9c commit d5f4abd

File tree

3 files changed

+95
-0
lines changed

3 files changed

+95
-0
lines changed

22_bridge/README.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# 桥接模式
2+
3+
桥接模式分离抽象部分和实现部分。使得两部分独立扩展。
4+
5+
桥接模式类似于策略模式,区别在于策略模式封装一系列算法使得算法可以互相替换。
6+
7+
策略模式使抽象部分和实现部分分离,可以独立变化。

22_bridge/bridge.go

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package bridge
2+
3+
import "fmt"
4+
5+
type AbstractMessage interface {
6+
SendMessage(text, to string)
7+
}
8+
9+
type MessageImplementer interface {
10+
Send(text, to string)
11+
}
12+
13+
type MessageSMS struct{}
14+
15+
func ViaSMS() MessageImplementer {
16+
return &MessageSMS{}
17+
}
18+
19+
func (*MessageSMS) Send(text, to string) {
20+
fmt.Printf("send %s to %s via SMS", text, to)
21+
}
22+
23+
type MessageEmail struct{}
24+
25+
func ViaEmail() MessageImplementer {
26+
return &MessageEmail{}
27+
}
28+
29+
func (*MessageEmail) Send(text, to string) {
30+
fmt.Printf("send %s to %s via Email", text, to)
31+
}
32+
33+
type CommonMessage struct {
34+
method MessageImplementer
35+
}
36+
37+
func NewCommonMessage(method MessageImplementer) *CommonMessage {
38+
return &CommonMessage{
39+
method: method,
40+
}
41+
}
42+
43+
func (m *CommonMessage) SendMessage(text, to string) {
44+
m.method.Send(text, to)
45+
}
46+
47+
type UrgencyMessage struct {
48+
method MessageImplementer
49+
}
50+
51+
func NewUrgencyMessage(method MessageImplementer) *UrgencyMessage {
52+
return &UrgencyMessage{
53+
method: method,
54+
}
55+
}
56+
57+
func (m *UrgencyMessage) SendMessage(text, to string) {
58+
m.method.Send(fmt.Sprintf("[Urgency] %s", text), to)
59+
}

22_bridge/bridge_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package bridge
2+
3+
func ExampleCommonSMS() {
4+
m := NewCommonMessage(ViaSMS())
5+
m.SendMessage("have a drink?", "bob")
6+
// Output:
7+
// send have a drink? to bob via SMS
8+
}
9+
10+
func ExampleCommonEmail() {
11+
m := NewCommonMessage(ViaEmail())
12+
m.SendMessage("have a drink?", "bob")
13+
// Output:
14+
// send have a drink? to bob via Email
15+
}
16+
17+
func ExampleUrgencySMS() {
18+
m := NewUrgencyMessage(ViaSMS())
19+
m.SendMessage("have a drink?", "bob")
20+
// Output:
21+
// send [Urgency] have a drink? to bob via SMS
22+
}
23+
24+
func ExampleUrgencyEmail() {
25+
m := NewUrgencyMessage(ViaEmail())
26+
m.SendMessage("have a drink?", "bob")
27+
// Output:
28+
// send [Urgency] have a drink? to bob via Email
29+
}

0 commit comments

Comments
 (0)