0

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

 7 months ago
source link: https://loli.fj.cn/zh-CN/2024/02/18/Go%E8%AF%AD%E8%A8%80%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%9A%84%E7%BB%93%E6%9E%84%E5%9E%8B%E6%A8%A1%E5%BC%8F/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Go 语言设计模式的结构型模式学习笔记

适配器模式

  • 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
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()
}
  • 将抽象部分与实际部分分离,使它们都可以独立的变化
  • 将对象组合成树形结构以表示部分-整体的结构层次,使得用户对单个对象和组合对象的使用局右一致性
  • 动态的给一个对象添加一些额外的职责
  • 就增加功能来说,此模式比生成子类更为灵活
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()
}
  • 为子系统中的一组接口提供一个一致的界面
  • 此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
  • 以共享的方式高效的支持大量的细粒度的对象
  • 为其他对象提供一种代理以控制这个对象的访问
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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK