zoukankan      html  css  js  c++  java
  • 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()
    }
    
  • 相关阅读:
    DRF项目之视图获取路径参数
    DRF项目之层级关系
    DRF项目之序列化器和视图重写方法的区别
    DRF项目之自定义分页器
    DRF项目之实现用户密码加密保存
    DRF项目之通过业务逻辑选择数据集和序列化器
    DRF项目之自定义JWT认证响应数据
    PIP一次性导入所有环境和指定镜像源
    DRF项目之JWT认证方式的简介及使用
    DRF项目之解决浏览器同源策略问题
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14118823.html
Copyright © 2011-2022 走看看