1. 概念
适配器(Adapter)指将某种接口或数据结构转换为客户端期望的类型,使得不兼容的类或对象能够一起协作。
1.1 角色
目标(Target):客户端调用的目标接口
被适配者(Adaptee):已经存在且运行良好的类或对象,但它不能实现Taget接口。
适配器(Adapter):继承或管理被适配者,且可以实现目标接口。
1.2 应用场景
- 背景
- 已经有一个目标接口供客户端调用
- 根据需求新增一个类(该类不能实现目标接口)
- 修改目标接口开销会很大
- 解决方法
- 我们新增一个类——适配器
- 适配器继承新增类,且可以实现目标接口
- 结果
- 客户端用适配器处理新增类的实例,得到的实例可以实现目标接口。
1.2 类图
classDiagram
Target <|.. Class
Target <|.. Adapter
Adaptee <|-- Adapter
Client --> Target
class Target {
<<interface>>
+Service()
}
class Class{
+Service()
}
class Adaptee{
+AnotherService()
}
class Adapter{
+*Adaptee:Adaptee
+Service()
}
class Client{
}
2. 代码示例
2.1 设计
- 背景
- client通过Bird接口可以获取鸟类实例的信息
- 有一个Cat类,不能实现Bird接口
- 但是需要client调用Bird接口来获取Cat实例的信息
- 解决
- 创建一个适配器CatAdapter
- 它继承Cat类
- 且实现Bird接口
- 创建一个适配器CatAdapter
2.2 代码
package main
import "fmt"
//之前有一个Bird接口,他可以Get鸟类的信息
type Bird interface {
Get()
}
//比如这个鹦鹉类,实现了Bird接口
type Parrot struct {
Name string
Feather string
}
func (parrot *Parrot) Get() {
fmt.Printf("鹦鹉%q的颜色是:%q\n", parrot.Name, parrot.Feather)
}
//业务需求,多了一个猫的类
type Cat struct {
Name string
Fur string
}
//它只有Show方法,不能实现Bird接口
func (cat *Cat) Show() {
fmt.Printf("猫咪%q的颜色是:%q\n", cat.Name, cat.Fur)
}
//我们创建一个猫的解释器,他继承了猫类,同时又可以实现Bird接口
type CatAdapter struct {
Cat *Cat
}
func (catAdapter *CatAdapter) Get() {
catAdapter.Cat.Show()
}
//有一个客户端
type Client struct {
}
//它可以直接获取bird信息
func (client Client) GetBird(bird Bird) {
bird.Get()
}
func main() {
//实例化一个叫polly的鹦鹉
polly := &Parrot{
Name: "polly",
Feather: "green",
}
//示例话一个叫tom的猫
tom := &Cat{
Name: "tom",
Fur: "black",
}
client := Client{}
//客户端可以直接使用polly
client.GetBird(polly)
//客户端可以通过解释器使用tom
tomAdapter := &CatAdapter{Cat: tom}
client.GetBird(tomAdapter)
}
2.3 示例类图
classDiagram
Bird <|.. Parrot
Bird <|.. CatAdapter
Cat <|-- CatAdapter
Client --> Bird
class Bird {
<<interface>>
+Get()
}
class Parrot{
+String:Name
+String:Feather
}
class Cat{
+String:Name
+String:Fur
+Show()
}
class CatAdapter{
+*Cat:Cat
+Get()
}
class Client{
GetBird(bird Bird)
}