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,如需转载请自行联系原作者
目录
相关文章
|
1天前
|
设计模式 Java API
重构旧代码的秘诀:用设计模式 - 适配器模式(Adapter)给Java项目带来新生
【4月更文挑战第7天】适配器模式是解决接口不兼容问题的结构型设计模式,通过引入适配器类实现目标接口并持有不兼容类引用,实现旧代码与新接口的协作。适用于处理兼容性问题、整合遗留代码和集成第三方库。应用时,识别不兼容接口,创建适配器类转换方法调用,然后替换原有引用。注意保持适配器简单、使用组合和考虑扩展性。过度使用可能导致系统复杂和维护成本增加,应谨慎使用。
|
1天前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
38 4
|
1天前
|
设计模式 Java Go
【设计模式】适配器模式怎么理解?
【设计模式】适配器模式怎么理解?
8 1
|
1天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式
|
1天前
|
设计模式 Go
[设计模式 Go实现] 结构型~适配器模式
[设计模式 Go实现] 结构型~适配器模式
|
1天前
|
设计模式 Java
【设计模式系列笔记】适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一种接口。它允许原本由于接口不匹配而无法一起工作的类能够协同工作。适配器模式通常涉及一个称为适配器的类,它充当两个不兼容接口之间的桥梁。
40 6
|
1天前
|
设计模式 Java 数据库
小谈设计模式(18)—适配器模式
小谈设计模式(18)—适配器模式
|
1天前
|
设计模式 算法 API
适配器模式:C++设计模式中的瑞士军刀
适配器模式:C++设计模式中的瑞士军刀
49 0
|
1天前
|
设计模式
设计模式之适配器模式
设计模式之适配器模式
|
1天前
|
设计模式 Java Linux
适配器模式--设计模式
适配器模式--设计模式
18 0

热门文章

最新文章