DesignPartternAdapter适配器模式
DesignPartternAdapter适配器模式
定义
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
go大牛的参考
package adapter
//Target 是适配的目标接口
type Target interface {
Request() string
}
//Adaptee 是被适配的目标接口
type Adaptee interface {
SpecificRequest() string
}
//AdapteeImpl 是被适配的目标类
type adapteeImpl struct{}
//NewAdaptee 是被适配接口的工厂函数
func NewAdaptee() Adaptee {
return &adapteeImpl{}
}
//SpecificRequest 是目标类的一个方法
func (*adapteeImpl) SpecificRequest() string {
return "adaptee method"
}
//Adapter 转换器
type adapter struct {
Adaptee Adaptee
}
//NewAdapter 转换器
func NewAdapter(adaptee Adaptee) Target {
return &adapter{
Adaptee: adaptee,
}
}
//Request 实现Target接口
func (a *adapter) Request() string {
return a.Adaptee.SpecificRequest()
}
# 测试文件
package adapter
import "testing"
var expect = "adaptee method"
func TestAdapter(t *testing.T) {
adaptee := NewAdaptee()
target := NewAdapter(adaptee)
res := target.Request()
if res != expect {
t.Fatalf("expect: %s, actual: %s", expect, res)
}
}
毛哥的通俗讲解
场景模拟:
- 有这样的为性别作为区分的工作,男人只能·在男人领域工作,女人只能在女人区域工作
- 到最后的福利待遇也是按照性别作为大规模发放的
- 但是有小花这样的女人,天生牛逼,可以作男人的工作
- 奈何天生是女人,只能变性为男人了
// 小花是个女孩,只能干女生工作,但是他想去男生工作拿去试试
// 所以只能去黑市把自己打扮成男的
package adapter
import "fmt"
// 男人场所
type ManSpace interface {
ManWork()
}
// 女性场所
type WomanSpace interface {
WomanWork()
}
type Man struct {
Name string
Kill string
}
func NewMan(n string, k string) *Man {
return &Man{
Name: n,
Kill:k,
}
}
func (m *Man) ManWork() {
fmt.Println("男人")
fmt.Println(m.Name, " can do ", m.Kill)
}
type Woman struct {
Name string
Kill string
}
func NewWoman(n, k string) *Woman {
return &Woman{
Name: n,
Kill: k,
}
}
func (w *Woman) WomanWork() {
fmt.Println("女人")
fmt.Println(w.Name, " can do ", w.Kill)
}
// 福利
func ToMan(ms ManSpace) {
fmt.Println("男人的特殊福利")
}
func ToWoman(ws WomanSpace) {
fmt.Println("女人的特殊福利")
}
// 女生变男生化妆间
type AdapteToMan struct {
Woman Woman
}
func NewAdapteToMan(atm Woman) ManSpace {
return &AdapteToMan{
Woman:atm,
}
}
func (atm *AdapteToMan) ManWork() {
atm.Woman.WomanWork()
}
func Tmain2() {
xiao_hua := NewWoman("小花", "开飞机")
man_xiao_hua := NewAdapteToMan(*xiao_hua)
ToMan(man_xiao_hua)
man_xiao_hua.ManWork()
}
# 输出
男人的特殊福利
女人
小花 can do 开飞机
小核心
注意初始化时候返回的是接口,但是结构体的属性是女生的
// 女生变男生化妆间
type AdapteToMan struct {
Woman Woman
}
func NewAdapteToMan(atm Woman) ManSpace {
return &AdapteToMan{
Woman:atm,
}
}
func (atm *AdapteToMan) ManWork() {
atm.Woman.WomanWork()
}