设计模式浅析-适配器模式

前言:

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] 终于联通了

 

 

 

应用场景:

其实适配器模式在实际编码过程中还是经常遇到的,可以结合其他模式一起讨论,后续更新……

总结:

感谢辉哥使这篇博客成为可能,谢谢,也希望对大家有帮助。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值