在现实生活中,我们的笔记本电脑的工作电压大多数都是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够工作在220V的电压下工作?答案:引入一个电源适配器,俗称变压器,有了这个电源适配器,生活用电和笔记本电脑即可兼容。
软件开发的过程中,有时候也会存在这种不兼容的情况,我们也可以像引入一个称之为适配器的角色来协调这些存在不兼容的结构,即我们下面要讲的设配器模式。
1 定义
适配器(Adapter)模式:将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。
UML类图如下:
适配器模式一般包含3个角色:
- Target(目标接口角色): 定义了客户所需要的接口
- Adapter(适配器角色): 实现了Target接口,并且还能调用另一个接口,起到适配的作用
- Adaptee(被适配角色): 即被适配的角色,定义了一个已经存在的接口
2 go语言实现
2.1 目标Target接口
type Target interface {
Request()
}
2.2 被适配Adaptee接口
type Adaptee interface {
SpecificRequest()
}
type XiaoMiAdaptee struct{}
func (xma XiaoMiAdaptee) SpecificRequest() {
fmt.Println("This is a specific request from Xiao Mi")
}
type HuaWeiAdaptee struct{}
func (hwa HuaWeiAdaptee) SpecificRequest() {
fmt.Println("This is a specific request from Hua Wei")
}
2.3 适配器Adapter角色
type Adapter struct {
Adaptee
}
func (a Adapter) Request() {
a.SpecificRequest()
}
这里使用了go语言中的匿名组合,所以Adapter也就拥有了SpecificRequest实例方法,又因为Go语言中非侵入式接口特征,这样的话,Adapter其实也适配Adaptee接口
2.4 使用工厂函数创建Adapter和Adaptee实例
func NewAdapter(adaptee Adaptee) Adapter {
return Adapter{
Adaptee: adaptee,
}
}
func NewAdaptee(t string) Adaptee {
switch t {
case "XiaoMi":
return XiaoMiAdaptee{}
case "HuaWei":
return HuaWeiAdaptee{}
default:
return nil
}
}
2.5 测试demo
func main() {
tAdaptee := adapter.NewAdaptee("HuaWei")
tAdapter := adapter.NewAdapter(tAdaptee)
tAdapter.Request()
fmt.Println("=============================")
tAdaptee = adapter.NewAdaptee("XiaoMi")
tAdapter = adapter.NewAdapter(tAdaptee)
tAdapter.Request()
}
|
请发表评论