前言:
2017年悄悄的来了,无声无息的以至于我都还没好好缅怀一下荒诞的2016,不得不说,2016没能通过努力达到应该有的程度,看样子目标还是要有的,那就先设定一个小目标吧;
设计模式:
“当你学会了设计模式,就要忘记设计模式”——辉哥;
适配器模式:
看了标题:适配器模式,设计模式的一种,那为什么是浅析呢?因为我也是刚刚会了一点意;
那么什么是适配器模式呢?
所有的设计模式处理的都是类或是对象之间的关系使之更加合理,适配器模式处理的就是 将一个类的接口转换成客户希望的接口,使原本由于接口不兼容而无法一起工作的类可以一起工作;
为了说明问题,我们先明确几个角色:
1.客户(Client);
2.目标接口(Target):客户希望的接口;
3.被适配的类(Adaptee);
4.适配器(Adapter);
适配器模式分为两种:类适配器 和 对象适配器;
来看下类图:
类适配器:
Adapter继承自Adaptee;
对象适配器:
Adapter依赖于Adaptee,可以在适配一组类的时候使用;
代码示例:
我们定义四个类分别对应:客户、对象适配器、类适配器、被适配的类;
我们模拟一个场景:
1.两孔插销(客户 对应User类),需要两孔插座(需要的接口);
2.没有两孔插座,只有三孔(不匹配的接口)的插座(被适配的类 Adapatee);
3.找个转接头来转接下(适配器 Adapter)(转接头可以将不匹配的接口转换为需要的接口);
被适配的类:
提供的是不匹配的接口,只能接受三孔插销;
import UIKit
class Adaptee: NSObject {
func opConnected3(num:Int) -> Bool {
guard num == 3 else {
return false
}
self.connectSuccess()
return true
}
func connectSuccess() -> Void {
NSLog("终于联通了")
}
}
客户希望的接口:
我们通过协议声明一组接口,以接受两孔插销;
protocol ConnectDelegate {
func opConnected2(num:Int) -> Bool
}
对象适配器:
建立依赖关系,实现协议声明的接口,接受两孔插销;
class Adapter:NSObject, ConnectDelegate {
let adaptee = Adaptee()
func opConnected2(num:Int) -> Bool {
guard num == 2 else {
return false
}
return self.adaptee.opConnected3(num: 3)
}
}
类适配器:
继承自被适配的类,实现协议声明的接口,接受两孔插销;
class Adapter1: Adaptee,ConnectDelegate {
func opConnected2(num:Int) -> Bool {
guard num == 2 else {
return false
}
return self.opConnected3(num: 3)
}
}
User类的实现:
其中Adapter是实现了ConnectDelegate协议方法的实例,作为两孔插座供两孔插销使用;
import UIKit
class User: NSObject {
func opConnectToAdaptee() -> Void {
NSLog("两孔插销:我是两口插销,需要两孔插座")
if Adaptee().opConnected3(num: 2) == false {
NSLog("三孔插座:不好意思,我是三孔的插座,你用不了的")
NSLog("两孔插销:那怎么办啊?")
NSLog("三孔插座:找一个转接头吧!")
}
}
func opConnectToAdapter() -> Void {
NSLog("两孔插销:我是两口插销,需要两孔插座")
NSLog("转接头:我是转接头,你需要2孔-3孔的转接处理对吧,我可以满足你的需求")
if Adapter().opConnected2(num: 2) == false {
NSLog("转接头:")
}
}
func opConnectToAdapter1() -> Void {
NSLog("两孔插销:我是两口插销,需要两孔插座")
NSLog("转接头:我是转接头,你需要2孔-3孔的转接处理对吧,我可以满足你的需求")
if Adapter1().opConnected2(num: 2) == false {
NSLog("转接头:")
}
}
}
我们可以这样调用:
let user = User()
user.opConnectToAdaptee() //两孔插销直接对应三孔插座-失败
user.opConnectToAdapter() //两孔插销通过转接头对应三孔插座-成功(对象适配器)
user.opConnectToAdapter1() //两孔插销通过转接头对应三孔插座-成功(类适配器)
输出log:
2017-01-10 19:05:42.961 SPQDemo[81122:2358560] -------------------场景---------------------
2017-01-10 19:05:42.962 SPQDemo[81122:2358560] 两孔插销:我是两口插销,需要两孔插座
2017-01-10 19:05:42.962 SPQDemo[81122:2358560] 三孔插座:不好意思,我是三孔的插座,你用不了的
2017-01-10 19:05:42.962 SPQDemo[81122:2358560] 两孔插销:那怎么办啊?
2017-01-10 19:05:42.962 SPQDemo[81122:2358560] 三孔插座:找一个转接头吧!
2017-01-10 19:05:42.962 SPQDemo[81122:2358560] -------------------对象适配器---------------------
2017-01-10 19:05:42.962 SPQDemo[81122:2358560] 两孔插销:我是两口插销,需要两孔插座
2017-01-10 19:05:42.963 SPQDemo[81122:2358560] 转接头:我是转接头,你需要2孔-3孔的转接处理对吧,我可以满足你的需求
2017-01-10 19:05:42.963 SPQDemo[81122:2358560] 终于联通了
2017-01-10 19:05:42.963 SPQDemo[81122:2358560] -------------------类适配器---------------------
2017-01-10 19:05:42.963 SPQDemo[81122:2358560] 两孔插销:我是两口插销,需要两孔插座
2017-01-10 19:05:42.963 SPQDemo[81122:2358560] 转接头:我是转接头,你需要2孔-3孔的转接处理对吧,我可以满足你的需求
2017-01-10 19:05:42.963 SPQDemo[81122:2358560] 终于联通了
应用场景:
其实适配器模式在实际编码过程中还是经常遇到的,可以结合其他模式一起讨论,后续更新……
总结:
感谢辉哥使这篇博客成为可能,谢谢,也希望对大家有帮助。