当前位置: 首页 > news >正文

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

文章目录

  • 1. 概念
    • 1.1 角色
    • 1.2 应用场景
    • 1.2 类图
  • 2. 代码示例
    • 2.1 设计
    • 2.2 代码
    • 2.3 示例类图

1. 概念

定义一个适配器,帮助原本不能实现接口的类“实现”该接口

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 mainimport "fmt"
//之前有一个Bird接口,他可以Get鸟类的信息
type Bird interface {Get()
}//比如这个鹦鹉类,实现了Bird接口
type Parrot struct {Name    stringFeather string
}func (parrot *Parrot) Get() {fmt.Printf("鹦鹉%q的颜色是:%q\n", parrot.Name, parrot.Feather)
}//业务需求,多了一个猫的类
type Cat struct {Name stringFur  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{}//客户端可以直接使用pollyclient.GetBird(polly)//客户端可以通过解释器使用tomtomAdapter := &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)

在这里插入图片描述

http://www.lryc.cn/news/115867.html

相关文章:

  • 机器学习概述及其主要算法
  • 识jvm堆栈中一个数据类型是否为为引用类型,目前虚拟机实现中是如何做的?
  • Bug合集
  • linux下.run安装脚本制作
  • 面试热题(翻转k个链表)
  • 前端面试的性能优化部分(4)每天10个小知识点
  • el-checkbox修改选中和未选中的值
  • 完整版:TCP、UDP报文格式
  • 如何远程连接云服务器oracle数据库
  • “深入剖析JVM内部机制:探秘Java虚拟机的运行原理“
  • 尚品汇总结十:秒杀模块(面试专用)
  • 什么是设计模式?
  • Node.js |(三)Node.js API:path模块及Node.js 模块化 | 尚硅谷2023版Node.js零基础视频教程
  • Netty自定义编码解码器
  • HOperatorSet.OpenFramegrabber “GigEVision“
  • 图的遍历DFSBFS-有向图无向图
  • 【NLP】深入浅出全面回顾注意力机制
  • Linux应用编程的read函数和Linux驱动编程的read函数的区别
  • Kubernetes(K8s)从入门到精通系列之十:使用 kubeadm 创建一个高可用 etcd 集群
  • 使用动态规划实现错排问题-2023年全国青少年信息素养大赛Python复赛真题精选
  • 大规模向量检索库Faiss学习总结记录
  • SpringCloudAlibaba之Sentinel(一)流控篇
  • 哪种模式ip更适合你的爬虫项目?
  • 优维低代码实践:对接数据
  • docker 离线模式-部署容器
  • MDN-HTTP
  • 【数据库】PostgreSQL中使用`SELECT DISTINCT`和`SUBSTRING`函数实现去重查询
  • 笔记本WIFI连接无网络【实测有效,不用重启电脑】
  • Java课题笔记~ Spring 概述
  • 2022 robocom 世界机器人开发者大赛-本科组(国赛)