Golang 设计模式 学习笔记(七)适配器模式

简介:

   我们先来看一段golang代码,如果它走起来像只鸭子,叫起来像只鸭子,那么它可能是一只包装了鸭子适配器的火鸡。假设缺少鸭子对象,想用一些火鸡对象来冒充,显而易见火鸡的接口不同,需要写个适配器:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package  main
                                                                                                                                                                                                                                                                                 
import  (
     "fmt"
)
                                                                                                                                                                                                                                                                                 
func main() {
     duck := &MallardDuck{}
     turkey := &WildTurkey{}
     turkeyAdapter := NewTurkeyAdapter(turkey)
                                                                                                                                                                                                                                                                                 
     fmt.Println( "The Turkey says..." )
     turkey.gobble()
     turkey.fly()
                                                                                                                                                                                                                                                                                 
     fmt.Println( "The Duck says..." )
     duck.quack()
     duck.fly()
                                                                                                                                                                                                                                                                                 
     fmt.Println( "The TurkeyAdapter says..." )
     turkeyAdapter.quack()
     turkeyAdapter.fly()
}
                                                                                                                                                                                                                                                                                  
//鸭子Duck接口,具备呱呱叫和飞行的能力
type Duck  interface  {
     quack()  //呱呱叫
     fly()    //飞行
}
                                                                                                                                                                                                                                                                                  
//火鸡Turkey接口
type Turkey  interface  {
     gobble()  //火鸡不会呱呱叫,只会咯咯叫(gobble)
     fly()     //火鸡也会飞,虽然飞不远
}
                                                                                                                                                                                                                                                                                  
//实现了Duck接口
type MallardDuck struct{}
                                                                                                                                                                                                                                                                                  
func (*MallardDuck) quack() {
     fmt.Println( "Quack..." )
}
                                                                                                                                                                                                                                                                                  
func (*MallardDuck) fly() {
     fmt.Println( "I'm flying" )
}
//实现了Turkey接口
type WildTurkey struct{}
func (*WildTurkey) gobble() {
     fmt.Println( "Gobble..." )
}
                                                                                                                                                                                                                                                                                  
func (*WildTurkey) fly() {
     fmt.Println( "I'm flying a short distance" )
}
                                                                                                                                                                                                                                                                                  
//首先,需要实现想转换成的类型接口,也就是
//客户所期望看到的接口
type TurkeyAdapter struct {
     turkey  Turkey
}
                                                                                                                                                                                                                                                                                  
//接着,需要取得适配的对象引用
func NewTurkeyAdapter(turkey Turkey) *TurkeyAdapter {
     return  &TurkeyAdapter{ turkey }
}
                                                                                                                                                                                                                                                                                  
//现在需要实现接口中所有的方法,
//quack在类之间的转换很简单,调用gobble就可以。
func ( this  *TurkeyAdapter) quack() {
     this .turkey.gobble()
}
                                                                                                                                                                                                                                                                                  
//两个接口都具备了fly方法,火鸡飞行距离短,
//要让火鸡和鸭子的飞行能对应,必须连续五次调用火鸡的fly
func ( this  *TurkeyAdapter) fly() {
     for  i :=  0 ; i <  5 ; i++ {
         this .turkey.fly()
     }
}

   现在我们知道什么是适配器了,再看看各部分之间的关系:

wKiom1MB7T3x_RE4AAROTBX8dOk215.jpg


   客户使用适配器的过程如下:

1.客户通过目标接口调用适配器的方法对适配器发出请求。

   2.适配器使用被适配者接口把请求转换成被适配者的一个或者多个调用接口。

   3.客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。


   适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

wKiom1MB_IvRYOV3AAF9gGc2rnY763.jpg

   这个适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者。这种做法还有额外的优点,那就是,被适配者的任何子类,都可以搭配着适配器使用。

   实际上,有“两种”适配器:“对象”适配器和“类”适配器。上述所述为“对象”适配器。“类”适配器不是使用组合来适配被适配者,而是继承被适配者和目标类。













本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1359920,如需转载请自行联系原作者
目录
相关文章
|
27天前
|
设计模式 JSON 前端开发
前端必须掌握的设计模式——适配器模式
适配器模式是一种结构型设计模式,用于使接口不兼容的对象能够相互合作。通过在客户端和系统之间引入一个“中间层”适配器,将不同类型的输入数据转换为系统能处理的标准格式,减轻系统的负担,提高扩展性和可维护性。例如,MacBook的扩展坞将多种接口(如HDMI、USB)转换为Type-C接口,实现多接口兼容。
|
3月前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
39 2
|
4月前
|
设计模式 Java 程序员
Java设计模式-适配器模式(8)
Java设计模式-适配器模式(8)
Go语言的条件控制语句及循环语句的学习笔记
本文是Go语言的条件控制语句和循环语句的学习笔记,涵盖了if语句、if-else语句、if嵌套语句、switch语句、select语句以及for循环和相关循环控制语句的使用方法。
Go语言的条件控制语句及循环语句的学习笔记
|
3月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
49 0
|
3月前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
37 0
|
3月前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
67 0
|
4月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
4月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
5月前
|
设计模式 XML 存储
【六】设计模式~~~结构型模式~~~适配器模式(Java)
文章详细介绍了适配器模式(Adapter Pattern),这是一种结构型设计模式,用于将一个类的接口转换成客户期望的另一个接口,使原本不兼容的接口能够一起工作,提高了类的复用性和系统的灵活性。通过对象适配器和类适配器两种实现方式,展示了适配器模式的代码应用,并讨论了其优点、缺点以及适用场景。