惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
U
Unit 42
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
Stack Overflow Blog
Stack Overflow Blog
爱范儿
爱范儿
博客园 - 司徒正美
Vercel News
Vercel News
I
InfoQ
GbyAI
GbyAI
C
Check Point Blog
B
Blog RSS Feed
Martin Fowler
Martin Fowler
B
Blog
MyScale Blog
MyScale Blog
腾讯CDC
博客园 - Franky
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hugging Face - Blog
Hugging Face - Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 三生石上(FineUI控件)

Jiajun的技术笔记

你好,2026! TiDB 源码阅读(六):TiDB Coprocessor 源码解析 性能优化的核心思想 TiDB 源码阅读(五):索引 TiDB 源码阅读(四):AST、逻辑计划、物理计划 CockroachDB Serverless Architecture podman 无故退出 Cursor Control-L (CTRL-L) Keyboard Shortcuts in Terminal Replace docker with podman Using xmonad with xfce4 A RC script for freebsd frpc 自己动手写一个k8s controller AI 会取代你的(编程)岗位吗? 自建DERP服务器提升Tailscale连接速度(使用Nginx转发) 自动升级Docker容器 再读《程序员修炼之道-从小工到专家》 让浏览器下载文件 再读《软件随想录》/《黑客与画家》/《软技能》 HTTP 压力测试中的 Coordinated Omission 2的补码 编程语言中的 context 是什么? flutter macOS 构建出错 Flatpak 使用小记 Golang CAS 操作是怎么实现的 PostgreSQL 当MQ来使用 Clash 结合 工作VPN 的网络设计 使用 PostgreSQL 搭建 JuiceFS PostgreSQL 配置优化和日志分析 有GitHub Copilot?那就可以搭建你的ChatGPT4服务 窗口函数的使用(以PG为例)
Go设计模式:适配器模式
Jiajun Huang · 2020-06-09 · via Jiajun的技术笔记

我买过一个港版的手机,香港的插座和大陆不一样,电压也不一样,因此为了充电,我还买了一个转换头,这个转换头,就是起的 适配器的使用。

原本,大陆插座是两个孔的;而香港的是三个孔,也就是说我手机是没有办法充电的。但是通过转换头之后,转换头插入大陆插座, 而它自身提供一个三孔插座可以让香港的充电头插入,完成了适配的工作。

编程中也有类似的操作,应用的最多的莫过于代码/接口升级,而又需要保证老接口的兼容性,这个时候,为了让老接口继续工作, 我们需要提供一个中间层,让老接口对外的接口不变,但实际上代码却调用了新代码。

举个例子,假设我们有一个老项目,他提供如下接口:

package main

import (
	"fmt"
)

func printName(firstName, secondName string) {
	fmt.Printf("firstName is %s, secondName is %s\n", firstName, secondName)
}

func main() {
	printName("Jiajun", "Huang")
}

看其中的 printName 函数的签名 (firstName, secondName string),打印结果就是:

$ go build && ./test 
firstName is Jiajun, secondName is Huang

但是不巧的是,这个项目现在被山西煤老板1一个亿收购了,煤老板是中国人,我们和外国人的名字不同之处,在于他们的名字在前, 姓氏在后,我们是姓氏在前,名字在后,所以老板使用这套系统的时候很不开心:

$ go build && ./test 
firstName is 三, secondName is 张

怎么叫三张呢?应该叫张三才对!因此我们需要把接口换一下,伟大的架构师决定重构!毕竟老板特别生气,但是老系统还有很多 老外的资料在跑,虽然所有中国人都用中国人的输出方式,但是还是希望不要把老外的也统一过来,要不然客户又要生气了。

所以架构师决定,用一个新的函数来替代以前的这个 printName,并且能够实现,中国人用中国人的方式打印,外国人用外国人的, 并且要提供扩展性:

package main

import (
	"fmt"
)

func isChinese(string) bool {
	// 略
	return true
}

func isEnglish(string) bool {
	// 略
	return true
}

func printEnglishName(firstName, secondName string) {
	fmt.Printf("firstName is %s, secondName is %s\n", firstName, secondName)
}

func printChineseName(familyName, name string) {
	fmt.Printf("姓: %s,名: %s", familyName, name)
}

func printName(familyName, name string) {
	if isChinese(familyName) {
		printEnglishName(name, familyName)
	} else if isEnglish(familyName) {
		printChineseName(familyName, name)
	} else {
		fmt.Println("暂不支持/Not support yet")
	}
}

func main() {
	// 略
}

如此,便成功的实现老板的需求,并且可以遇见,下次项目再被法国人一亿欧元买回去的时候,他们仍然可以愉快的使用这个系统。

这就是适配器的作用,对接多个端,如果你想不起什么是适配器的话,想象一下我的港版手机就知道了 :)