mirror of
https://github.com/crazybber/go-pattern-examples.git
synced 2024-11-22 20:06:02 +03:00
finish adapter pattern
This commit is contained in:
parent
1a136adc4b
commit
fe0152db45
@ -2,4 +2,6 @@
|
|||||||
|
|
||||||
适配器模式就是用来做适配的,实际应用过程中最容易遇到的就是,面对多种多样的设备和协议类型,做接入的时候,需要将设备的协议数据转换为系统内部能够识别的统一数据结构,对这就是适配器模式的一个实际场景,适配器用于转换一种形态到另一种形态,这种所谓的形态可能指数据结构、协议、计算方法、处理过程等
|
适配器模式就是用来做适配的,实际应用过程中最容易遇到的就是,面对多种多样的设备和协议类型,做接入的时候,需要将设备的协议数据转换为系统内部能够识别的统一数据结构,对这就是适配器模式的一个实际场景,适配器用于转换一种形态到另一种形态,这种所谓的形态可能指数据结构、协议、计算方法、处理过程等
|
||||||
|
|
||||||
在Adapter中匿名组合Adaptee接口,所以Adapter类也拥有SpecificRequest实例方法,又因为Go语言中非入侵式接口特征,其实Adapter也适配Adaptee接口。
|
现实生活中的U形水管接头、插头转换器就是一个简单明了的适配器模式的例子,两针插头,是无法插入三孔插座的,所以三转二的电源插座/插头转换器,就是一个是适配器.
|
||||||
|
|
||||||
|
代码中的适配器模式其实就是要实现一个,`三转二`的插头转换器,使两针插头可以正常充电.
|
||||||
|
@ -1,41 +1,64 @@
|
|||||||
package adapter
|
package adapter
|
||||||
|
|
||||||
//Target 是适配的目标接口
|
import "fmt"
|
||||||
type Target interface {
|
|
||||||
Request() string
|
//IPlug 插头
|
||||||
|
type IPlug interface {
|
||||||
|
GetPin() int
|
||||||
}
|
}
|
||||||
|
|
||||||
//Adaptee 是被适配的目标接口
|
//TwoPinPlugin 造一个两针的插头
|
||||||
type Adaptee interface {
|
type TwoPinPlugin struct {
|
||||||
SpecificRequest() string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//NewAdaptee 是被适配接口的工厂函数
|
//GetPin 获取插头针数
|
||||||
func NewAdaptee() Adaptee {
|
func (t *TwoPinPlugin) GetPin() int {
|
||||||
return &adapteeImpl{}
|
return 2
|
||||||
}
|
}
|
||||||
|
|
||||||
//AdapteeImpl 是被适配的目标类
|
//IPowerSocket 电源插座
|
||||||
type adapteeImpl struct{}
|
type IPowerSocket interface {
|
||||||
|
PlugCharging(p IPlug)
|
||||||
//SpecificRequest 是目标类的一个方法
|
|
||||||
func (*adapteeImpl) SpecificRequest() string {
|
|
||||||
return "adaptee method"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//NewAdapter 是Adapter的工厂函数
|
//IThreePinPowerSocket 三孔插座
|
||||||
func NewAdapter(adaptee Adaptee) Target {
|
type IThreePinPowerSocket interface {
|
||||||
return &adapter{
|
ThreePinCharging(p IPlug)
|
||||||
Adaptee: adaptee,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Adapter 是转换Adaptee为Target接口的适配器
|
//ThreePinPowerSocket 是被适配的目标类
|
||||||
type adapter struct {
|
type ThreePinPowerSocket struct{}
|
||||||
Adaptee
|
|
||||||
|
//ThreePinCharging 只能为三针的插头通电
|
||||||
|
func (*ThreePinPowerSocket) ThreePinCharging(p IPlug) {
|
||||||
|
if p.GetPin() != 3 {
|
||||||
|
fmt.Println("i can not charge for this type")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println("charging for three pin plug")
|
||||||
|
}
|
||||||
|
|
||||||
|
//NewPowerAdapter 生产一个新的电源适配器
|
||||||
|
func NewPowerAdapter(threePinPowerSocket IThreePinPowerSocket) IPowerSocket {
|
||||||
|
return &PowerAdapter{IThreePinPowerSocket(threePinPowerSocket), 0}
|
||||||
|
}
|
||||||
|
|
||||||
|
//PowerAdapter 是能充电的关键电源转换器
|
||||||
|
type PowerAdapter struct {
|
||||||
|
IThreePinPowerSocket
|
||||||
|
pin int
|
||||||
|
}
|
||||||
|
|
||||||
|
//GetPin Adapter 的兼容能力
|
||||||
|
func (p *PowerAdapter) GetPin() int {
|
||||||
|
return p.pin
|
||||||
|
}
|
||||||
|
|
||||||
|
//PlugCharging 在PowerAdapter上进行实现
|
||||||
|
func (p *PowerAdapter) PlugCharging(ip IPlug) {
|
||||||
|
if ip.GetPin() == 2 {
|
||||||
|
p.pin = 3
|
||||||
|
p.ThreePinCharging(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
//Request 实现Target接口
|
|
||||||
func (a *adapter) Request() string {
|
|
||||||
return a.SpecificRequest()
|
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,22 @@
|
|||||||
package adapter
|
package adapter
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
var expect = "adaptee method"
|
func TestPowerSocketAdapter(t *testing.T) {
|
||||||
|
|
||||||
|
plug := &TwoPinPlugin{}
|
||||||
|
|
||||||
|
threePinSocket := ThreePinPowerSocket{}
|
||||||
|
|
||||||
|
//三孔插头是不能为两针插头充电的,可以试试看
|
||||||
|
threePinSocket.ThreePinCharging(plug)
|
||||||
|
|
||||||
|
//只好加一个电源适配器
|
||||||
|
powersocket := NewPowerAdapter(&threePinSocket)
|
||||||
|
|
||||||
|
//再试试能不能充电
|
||||||
|
powersocket.PlugCharging(plug)
|
||||||
|
|
||||||
func TestAdapter(t *testing.T) {
|
|
||||||
adaptee := NewAdaptee()
|
|
||||||
target := NewAdapter(adaptee)
|
|
||||||
res := target.Request()
|
|
||||||
if res != expect {
|
|
||||||
t.Fatalf("expect: %s, actual: %s", expect, res)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user