问题
:假设有一个软件系统,你但愿它能在不改变现有代码的前提下和一个新的厂商类库搭配使用,可是这个新厂商所设计出来的接口不一样于旧厂商的接口
这个问题和下图的问题相似python
美国标准的插头🔌没法在欧洲标准的插座上使用,一般的作法是什么呢?sql
添加一个插头适配器,适配器的做用是将欧式插头转换成美式插座,以便于让美式插头可使用。
因此,面对一个有全新接口的类库而又不能改变现有代码时,最早想到的作法是,在这两个系统之间添加一个适配器。数据库
有一个系统,须要一个鸭子🦆对象,可是如今只有一个火鸡🦃对象。鸭子和火鸡对象的功能简单描述以下:
# 鸭子的简单描述 class Duck: def quack(self): # 会呱呱叫 print("Quack") def fly(self): # 飞的能力 print("I'm flying") # 火鸡的简单描述 class Turkey: def gobble(self): # 不会呱呱叫,只会咯咯叫 print("Gobble gobble") def fly(self): # 飞的能力 可是飞不远 print("I'm flying a short distance")
由于如今没有鸭子对象,只能那火鸡对象冒充。因为鸭子对象和火鸡对象功能不一样,不能直接拿来用,如今就须要使用适配器来完成这个功能:json
class TurkeyAdapter(Duck): turkey = Turkey() # 这里实际使用的是火鸡对象 # 实现鸭子对象拥有的quack方法 def quack(self): self.turkey.gobble() def fly(self): # 假设火鸡比鸭子飞的短,为了模拟鸭子的动做,多飞几回 for i in range(5): turkey.fly()
接下来调用就能够像使用鸭子对象同样使用火鸡适配后的对象。小程序
# test duck = Duck() duck.quack() duck.fly() turkey_adapter = Duck() turkey_adapter.quack() turkey_adapter.fly()
如今再来看一下适配器使用的过程:设计模式
经过这个例子,接下来看一下适配器模式的正式定义并发
适配器模式:
将一个类的接口,转换成客户指望的另外一个接口。适配器让本来接口不兼容的类能够合做。
开放/封闭原则
是面向对象设计的基本原则之一,声明一个软件实体应该对扩展是开放的,对修改是关闭的。
本文例子来自《Head First 设计模式》。
最后,感谢女友支持和包容,比❤️spa
也能够在公号输入如下关键字获取历史文章:公号&小程序
| 设计模式
| 并发&协程
设计