【笔记】Go语言设计模式的结构型模式

前言

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
package main

// V5 5V充电接口
type V5 interface {
ChargeFor5V()
}

// V220 220V充电能力
type V220 struct{}

func (V220) ChargeFor220V() {}

// Phone 手机
type Phone struct {
v V5
}

// NewPhone 创建手机
func NewPhone(v V5) Phone {
return Phone{v}
}

// Charge 手机充电
func (phone *Phone) Charge() {
phone.v.ChargeFor5V()
}

// Adapter 适配器
type Adapter struct {
v220 *V220
}

// NewAdapter 创建适配器
func NewAdapter(v220 *V220) *Adapter {
return &Adapter{v220}
}

func (adapter *Adapter) ChargeFor5V() {
adapter.v220.ChargeFor220V()
}

func main() {
var phone Phone = NewPhone(NewAdapter(new(V220)))
phone.Charge()
}

桥接模式

  • 将抽象部分与实际部分分离,使它们都可以独立的变化

组合模式

  • 将对象组合成树形结构以表示部分-整体的结构层次,使得用户对单个对象和组合对象的使用局右一致性

装饰模式

  • 动态的给一个对象添加一些额外的职责
  • 就增加功能来说,此模式比生成子类更为灵活
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
package main

// Phone 手机
type Phone interface {
Show()
}

// PhoneDecorator 手机装饰器
type PhoneDecorator struct {
Phone Phone
}

func (PhoneDecorator) Show() {}

// HuaweiPhone 华为手机
type HuaweiPhone struct{}

func (HuaweiPhone) Show() {}

// XiaomiPhone 小米手机
type XiaomiPhone struct{}

func (XiaomiPhone) Show() {}

// PhoneFilmDecoration 手机贴膜装饰器
type PhoneFilmDecoration struct {
PhoneDecorator
}

// NewPhoneFilmDecoration 创建手机贴膜装饰器
func NewPhoneFilmDecoration(phone Phone) Phone {
return PhoneDecorator{Phone: phone}
}

func (phoneFilmDecoration *PhoneFilmDecoration) Show() {
phoneFilmDecoration.Phone.Show()
// 其他业务
}

func main() {
// 没有贴膜的华为手机
var huaweiPhone Phone = new(HuaweiPhone)
huaweiPhone.Show()

// 贴膜后的小米手机
var xiaomiPhone Phone = NewPhoneFilmDecoration(new(XiaomiPhone))
xiaomiPhone.Show()
}

外观模式

  • 为子系统中的一组接口提供一个一致的界面
  • 此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
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
package main

// AirConditioner 空调
type AirConditioner struct{}

// TurnOn 开空调
func (AirConditioner) TurnOn() {}

// TurnOff 关空调
func (AirConditioner) TurnOff() {}

// Light 灯
type Light struct{}

// TurnOn 开灯
func (Light) TurnOn() {}

// TurnOff 关灯
func (Light) TurnOff() {}

// UniversalRemoteControl 万能遥控器
type UniversalRemoteControl struct {
AirConditioner AirConditioner
Light Light
}

// TurnOnAll 全部打开
func (universalRemoteControl *UniversalRemoteControl) TurnOnAll() {
universalRemoteControl.AirConditioner.TurnOn()
universalRemoteControl.Light.TurnOn()
}

// TurnOffAll 全部关闭
func (universalRemoteControl *UniversalRemoteControl) TurnOffAll() {
universalRemoteControl.AirConditioner.TurnOff()
universalRemoteControl.Light.TurnOff()
}

func main() {
// 使用万能遥控器全部打开
var universalRemoteControl = UniversalRemoteControl{
AirConditioner: *new(AirConditioner),
Light: *new(Light),
}
universalRemoteControl.TurnOnAll()
}

享元模式

  • 以共享的方式高效的支持大量的细粒度的对象

代理模式

  • 为其他对象提供一种代理以控制这个对象的访问
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
package main

// Shopping 购物
type Shopping interface {
Buy()
}

// KoreaShopping 韩国购物
type KoreaShopping struct{}

func (KoreaShopping) Buy() {}

// AmericaShopping 美国购物
type AmericaShopping struct{}

func (AmericaShopping) Buy() {}

// OverSeasProxy 海外代理
type OverSeasProxy struct {
Shopping Shopping
}

// NewOverSeasProxy 创建海外代理
func NewOverSeasProxy(shopping Shopping) Shopping {
return &OverSeasProxy{shopping}
}

// Buy 海外代理购买
func (overSeasProxy *OverSeasProxy) Buy() {
overSeasProxy.Shopping.Buy()
// 其他业务
}

func main() {
// 自己在韩国购买
var shopping Shopping = new(KoreaShopping)
shopping.Buy()

// 通过代理在美国购买
var overSeasProxy Shopping = NewOverSeasProxy(new(AmericaShopping))
overSeasProxy.Buy()
}

完成

参考文献

哔哩哔哩——刘丹冰AceId