《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.mzph.cn/news/33227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

phpspreadsheet excel导入导出

单个sheet页Excel2003版最大行数是65536行。Excel2007开始的版本最大行数是1048576行。Excel2003的最大列数是256列,2007以上版本是16384列。 xlswriter xlswriter - PHP 高性能 Excel 扩展,功能类似phpspreadsheet。它能够处理非常大的文件&#xff0…

微信小程序隐私协议模板

在 设置 中找到 用户隐私保护 进行更新,如下图: 具体协议补充可参考如下: 为了分辨用户,开发者将在获取你的明示同意后,收集你的微信昵称、头像 为了显示距离,开发者将在获取你的明示同意后,收…

dubbo之高可用

负载均衡 概述 负载均衡是指在集群中,将多个数据请求分散到不同的单元上执行,主要是为了提高系统的容错能力和对数据的处理能力。 Dubbo 负载均衡机制是决定一次服务调用使用哪个提供者的服务。 策略 在Dubbo中提供了7中负载均衡策略,默…

综合能源系统(6)——综合能源综合评估技术

综合能源系统关键技术与典型案例  何泽家,李德智主编 综合能源系统是多种能源系统非线性耦合的、多时间与空间尺度耦合的“源-网-荷一储”一体化系统,通过能源耦合、多能互补,能够实现能源的高效利用,并提高新能源的利用水平。对…

在idea运行python文件

在idea运行python文件 如果在idea运行python文件而没有弹出run的选项,则点击File->Settings…->Plugins,在里面搜索python,如果没有显示则在Maketplace进行搜索, 接着Install,然后restart

Spring5新功能

文章目录 前言一、整合日志功能二、Nullable注解三、函数式风格编程四、JUnit5单元测试框架总结 前言 整合日志、Nullable注解、函数式风格编程、整合JUnit5、Webflux 一、整合日志功能 Spring5移除了Log4jConfigListener,官方建议使用Log4j2. 依赖: &…

history记录日期时间和日志记录操作

history命令能查看到操作日期和时间的配置方法: 1)在/etc/profile文件中添加一行: export HISTTIMEFORMAT"%F %T whoami " 2)保存后,执行加载命令: source /etc/profile 3)然后检…

056B R包ENMeval教程-基于R包ENMeval对MaxEnt模型优化调参和结果评价制图(更新)

056B-1 资料下载 056B-2 R包ENMeval在MaxEnt模型优化调参中的经典案例解读 056B-3 R软件和R包ENMeval工具包安装 056B-4 R软件和R包ENMeval安装报错解决办法 056B-5 环境数据格式要求和处理流程 056B-6 分布数据格式要求和处理流程 056B-7 基于R包ENMeval对MaxEnt模型优化…

使用宝塔面板轻松部署云服务器

作者 : SYFStrive 博客首页 : HomePage 📜: 宝塔面版 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &#x1f449…

配置docker,案例复现

配置docker(系统为centos) 1.检查操作系统环境: docker要求CentOS系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本是否支持安装docker 2.查看你是否拥有旧的版本,有的话卸载,没有的话直接略过该步骤 sudo yum remove d…

情感资源日记Resource Diary

什么是 Resource Diary ? Resource Diary 是自托管的情感资源日记,允许用户跟踪特定任务的情感反应以进行趋势识别。 按照作者的设计,对每个任务,通过 /- 号来表达任务完成后的情绪,等级从 0 到 5 ,其中&am…

lscpu的各个参数是什么意思?

$ lscpu Architecture: x86_64 #架构 CPU op-mode(s): 32-bit, 64-bit #运行方式 Byte Order: Little Endian #字节顺序 CPU(s): 96 #逻辑cpu数 On-line CPU(s) list: 0-95 #在线cpu Thread(s) per core: 2 #每个核包含线程…

【Redis】Redis内存过期策略和内存淘汰策略

【Redis】Redis内存过期策略和内存淘汰策略 文章目录 【Redis】Redis内存过期策略和内存淘汰策略1. 过期策略1.1 惰性删除1.2 周期删除1.2.1 SLOW模式1.2.2 FAST模式 2. 淘汰策略 1. 过期策略 Redis本身是一个典型的key-value内存存储数据库,因此所有的key、value都…

揭秘程序员和技师的7大共同点,最后一点绷不住了

大家好,这里是程序员晚枫,周末朋友出去放松回来,给我分析了一下程序员和技师的7个相同点,尤其是最后一点让我彻底绷不住了! 我也分享给大家。 1、都有工号。98号技师,380号技师大家都很熟悉了&#xff0c…

Unity使用C# Protobuf源码

目录 第一步:下载源码 第二步:运行C#构建文件 第三步:处理报错(如果你已安装对应的SDK则不会报错) 第四步:复制库文件到你的工程 第一步:下载源码 protobuf github源码https://github.com/p…

[管理与领导-10]:IT基层管理者 - 目标、责任、落实 - 如何把管理者的高高在上的目标,落地、落实到团队实施

目录 前言: 情形1:下属不知如何下手 情形2:下属不敢承诺 情形3:下属能力不够 情形4:奖罚机制失效,干活的动力不够 补充:目标与落实过节的进一步分析 1. 目标分解出了问题:目…

DNS:使用 bind9 配置主从权威DNS服务器

写在前面 分享一些 使用 bind9 配置主从权威名称服务器的笔记理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式…

24届近3年南京信息工程大学自动化考研院校分析

今天给大家带来的是南京信息工程大学控制考研分析 满满干货~还不快快点赞收藏 一、南京信息工程大学 学校简介 南京信息工程大学位于南京江北新区,是一所以大气科学为特色的全国重点大学,由江苏省人民政府、中华人民共和国教育部、中国气…

C++数学知识模板

试除法判定质数 模板 bool check_primes(int x) {for(int i 2; i * i < x; i) {if(x % i 0) return false;}return true; } 模板题 866. 试除法判定质数 给定 n个正整数 ai&#xff0c;判定每个数是否是质数。 输入格式 第一行包含整数 n。 接下来 n行&#xff0c…

LeetCode--HOT100题(27)

目录 题目描述&#xff1a;21. 合并两个有序链表&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;21. 合并两个有序链表&#xff08;简单&#xff09; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组…