《golang设计模式》第二部分·结构型模式-01-适配器模式(Adapter)

1. 概念

适配器(Adapter)指将某种接口或数据结构转换为客户端期望的类型,使得不兼容的类或对象能够一起协作。

1.1 角色

目标(Target):客户端调用的目标接口
被适配者(Adaptee):已经存在且运行良好的类或对象,但它不能实现Taget接口。
适配器(Adapter):继承或管理被适配者,且可以实现目标接口。

1.2 应用场景

  • 背景
    • 已经有一个目标接口供客户端调用
    • 根据需求新增一个类(该类不能实现目标接口)
    • 修改目标接口开销会很大
  • 解决方法
    • 我们新增一个类——适配器
    • 适配器继承新增类,且可以实现目标接口
  • 结果
    • 客户端用适配器处理新增类的实例,得到的实例可以实现目标接口。

1.2 类图

«interface»
Target
+Service()
Class
+Service()
Adapter
+*Adaptee:Adaptee
+Service()
Adaptee
+AnotherService()
Client

2. 代码示例

2.1 设计

  • 背景
    • client通过Bird接口可以获取鸟类实例的信息
    • 有一个Cat类,不能实现Bird接口
    • 但是需要client调用Bird接口来获取Cat实例的信息
  • 解决
    • 创建一个适配器CatAdapter
      • 它继承Cat类
      • 且实现Bird接口

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 示例类图

«interface»
Bird
+Get()
Parrot
+String:Name
+String:Feather
CatAdapter
+*Cat:Cat
+Get()
Cat
+String:Name
+String:Fur
+Show()
Client
GetBird(bird Bird)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值