适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。
现实生活中很多适配器模式的例子,比如MacBook的电源适配器,把220V的电压转换成20V的电压,再比如新版MacBook去掉了USB接口,还要买个雷电接口转USB的接口。
适配器模式一般都是被动引入,比如你的客户端需要读取一个json,但是你要调用一个第三方,这个第三方只能输出XML,这个时候为了不影响你的代码,就需要引入适配器,通过适配器把XML转成json输出给你。
我们先定义一个第三方:
class Third {
func output() -> String {
return "我是一段XML"
}
}
它只会输出XML。
然后我们自己的调用者:
class Client {
func input(json: String){
print("我只能读入json格式,谁要是不按我的来,我就跟谁急,现在我来看看你是不是json:\(json)")
if json.contains("JSON") {
print("嗯,不错,你是良民")
}else{
print("你的良心大大的坏了")
}
}
}
它需要一段JSON,如果不是它就会很生气。。。
现在我们来调用这个第三方,看看它会怎么样:
let client = Client()
let third = Third()
client.input(json: third.output())
输出:
我只能读入json格式,谁要是不按我的来,我就跟谁急,现在我来看看你是不是json:我是一段XML
你的良心大大的坏了
看来不行,接下来我们引入适配器:
class Adapter{
func convertXML2Json() -> String {
let xml = Third().output()
return "我把XML\(xml)转换成JSON并输出"
}
}
他可以把XML转换成JSON。
然后再调用:
client.input(json: Adapter().convertXML2Json())
输出是这样的:
我只能读入json格式,谁要是不按我的来,我就跟谁急,现在我来看看你是不是json:我把XML我是一段XML转换成JSON并输出
嗯,不错,你是良民
看起来小儿科了,但这就是适配器模式的核心,把不兼容的接口包装一层,变成可以用的接口。这样就不用修改第三方,也不用修改你自己已有的代码,符合开闭原则。
网友评论