设计模式之适配器模式

设计模式之适配器模式

概述

适配器模式: 将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装类(Wrapper),适配器模式既可以作为类结构型模式,也可以作为对象结构型模式

  • 在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合

类似封装(设计模式使用了大量的继承、封装、闭包、高阶函数等方法)

在适配器模式中,通过增加一个新的适配器类来解决接口不兼容的问题,使得没有任何关系的类可以协同工作。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器模式和类适配器模式两种。在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系

对象适配器模式包含3个角色

  • Target(目标抽象类): 目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类
  • Adapter(适配器类): 适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。适配器类是适配器模式的核心,在对象适配器模式中,他通过继承Target并关联一个Adaptee对象使二者产生联系
  • Adaptee(适配者类):适配者即被适配的对象,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体的类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码

TypeC转USB充电接口

假设我们现在只有type-C的充电口,但是我们需要给只接受USB充电口的设备充电,这个时候我们就需要一个充电适配器来进行充电接口的转换

package adapter

import "fmt"

// USBTarget 目标接口
type USBTarget interface {
	USBCharge()
}

// Adapter 适配器
type Adapter struct {
	Adaptee TypeCAdaptee
}

func NewAdapter(adaptee TypeCAdaptee) *Adapter {
	return &Adapter{
		Adaptee: adaptee,
	}
}

func (a *Adapter) USBCharge() {
	fmt.Println("充电接口转换->USB")
	a.Adaptee.TypeCCharge()
}

// TypeCAdaptee 适配者
type TypeCAdaptee struct {
}

func (t *TypeCAdaptee) TypeCCharge() {
	fmt.Println("开始充电")
}

这里我们定义了一个目标接口

// USBTarget 目标接口
type USBTarget interface {
   USBCharge()
}

还有一个Type-C的充电接口,这个Type-C接口是没办法进行USB充电的

// TypeCAdaptee 被适配者
type TypeCAdaptee struct {
}
func (t *TypeCAdaptee) TypeCCharge() {
	fmt.Println("开始充电")
}

如果我们手里只有Type-C的接口,是没办法使用USB的充电的,所以这里还需要有一个充电适配器

// Adapter 适配器
type Adapter struct {
   Adaptee TypeCAdaptee
}

func NewAdapter(adaptee TypeCAdaptee) *Adapter {
   return &Adapter{
      Adaptee: adaptee,
   }
}

func (a *Adapter) USBCharge() {
   fmt.Println("充电接口转换->USB")
   a.Adaptee.TypeCCharge()
}

这个充电适配器实现了USB充电的方法,在内部将充电的方法进行了转换,最后完成了USB的充电

测试

package adapter

import "testing"

func TestAdapter_ChargeAdapter(t *testing.T) {
   typeCAdaptee := TypeCAdaptee{}
   adapter := NewAdapter(typeCAdaptee)
   adapter.USBCharge()
}
//
// === RUN   TestAdapter_ChargeAdapter
// 充电接口转换,USB
// 充电
// --- PASS: TestAdapter_ChargeAdapter (0.00s)
// PASS

总结

优点
  1. 将目标类和适配者类接口,通过引入一个适配器类来重用现有的适配者类,无须修改原有的结构
  2. 增加了类的透明性和复用性,将具体的业务实现过程封装在适配器中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值