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()
}
posted @ 2020-12-24 16:02  maob  阅读(72)  评论(0编辑  收藏  举报