详解Objective-C编程中对设计模式中适的配器模式的使用

 更新时间:2016年03月23日 17:30:10   作者:Gof Lee  
这篇文章主要介绍了Objective-C编程中对设计模式中适的配器模式的使用,适配器模式中的Adapter适配器允许接口不兼容的类在一起工作,需要的朋友可以参考下

引言

  在项目开发中,有时候会遇到这样的一种情景:需要使用以前开发的“一些现存的对象”,但是新环境中要求的接口是这些现存对象所不满足的。怎样应对这种迁移的需求?使得可以复用这些对象,以满足新的应用环境,这就是适配器(Adapter)所要解决的问题。

定义

  “将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。”

最初的定义出现于《设计模式》(Addison-Wesley,1994)。
  这个定义应该很好理解,生活中也到处充满着适配器模式的应用,比如说我们手机的充电器:手机是不能在220V电源上直接充电的,充电器将电压转换成手机需要的电压后,手机才可以正常充电,这个充电器就起到了适配的作用。

结构图

  有两种实现适配器模式的方式。第一种是通过继承来适配两个接口,这称为类适配器。在Gof介绍设计模式的书中,类适配器是通过多重继承来实现的。书中使用的语言是C++,它并没有C#的接口或OC的协议这样的语法,一切都是类。在OC中,类可以实现协议,同时又继承父类,达到C++多继承的效果。要在OC中实现类适配器,首先需要有定义了客户端要使用的一套行为的协议,然后要用具体的适配器类来实现这个协议。适配器类同时也要继承被适配者。类适配器结构图如下所示:

2016323172641217.png (642×417)

从图中可以看到,Adapter是一个Target类型,同时也是Adaptee类型。它重载了Target的request方法,没有重载Adaptee中的specificRequest方法,而是在Adapter的request方法的实现中,调用父类的specificRequest方法。只有当Target是协议而不是类时,类适配器才能够用OC来实现,因为OC中是没有多重继承的。
  实现适配器模式的第二种方式称为对象适配器。与类适配器不同,对象适配器不继承被适配者,而是组合了一个对它的引用。对象适配器结构图如下所示:

2016323172706814.png (643×414)

 从两个结构图可以看到,Target和Adapter的关系相同,Adapter和Adaptee之间的关系,由继承变成了关联。这种关系下,Adapter需要保持一个对Adaptee的引用。在request方法中,Adapter发送[_adaptee specificRequest]消息给Adaptee,以完成客户端的请求。

  很显然,OC中常用的委托(Delegate)模式属于对象适配器。以常用的UITableViewDelegate为例,我这里先画出它的结构图,如下所示:

2016323172734328.png (616×299)

 UITableView(对象适配器中的Client角色)处理选中行事件时,消息会传递给UITableViewDelegate(对象适配器中Target角色),然后调用MyViewController(对象适配器中Adapter角色)里面的- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath方法来进行处理,在MyViewController的这个方法中,我们会调用其他对象(比如说我们可能会调用详情DetailViewController对象来跳转到详情页面)来处理该消息。

实例
Target类接口

复制代码 代码如下:

#import <Foundation/Foundation.h>

@interface Target:NSObject
-(void)Request;
@end


Target类实现
复制代码 代码如下:

#import "Target.h"

@implementation Target

-(void)Request{
    NSLog(@"普通请求!");
}
@end


Adaptee类接口
复制代码 代码如下:

#import <Foundation/Foundation.h>

@interface Adaptee:NSObject
-(void)SpecificRequest;
@end


Adaptee类实现
复制代码 代码如下:

#import "Adaptee.h"

@implementation Adaptee

-(void)SpecificRequest{
    NSLog(@"特殊请求!");
}
@end


Adapter类接口
复制代码 代码如下:

#import "Target.h"

@class Adaptee;
@interface Adapter :Target{
    Adaptee *adaptee;
}
@end


Adapter类实现
复制代码 代码如下:

#import "Adapter.h"
#import "Adaptee.h"

@implementation Adapter

-(id)init{
    if (self == [super init]) {
        adaptee = [[Adaptee alloc]init];
    }
    return self;
}
-(void)Request{
    [adaptee SpecificRequest];
}
@end


Main方法调用
复制代码 代码如下:

#import <Foundation/Foundation.h>
#import "Adapter.h"

int main(int argc,const char *argv[])
{
    @autoreleasepool{
        Target *target = [[Adapter alloc]init];
        [target Request];
    }
    return 0;
}

小结

1.适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。

2.适配器模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用,另外,OC中也不支持多重继承。对象适配器采用“对象组合”的方式,更符合松耦合规范。

在以下各种情况下可以考虑使用适配器模式:

1.需要使用一个已经存在的类,而它的接口不符合新环境的规范。
2.想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。

相关文章

  • iOS将时间NSDate转化为毫秒时间戳的方法示例

    iOS将时间NSDate转化为毫秒时间戳的方法示例

    这篇文章主要给大家介绍了关于iOS将时间NSDate转化为毫秒时间戳的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • iOS的HTTP请求和请求回执类用法小结

    iOS的HTTP请求和请求回执类用法小结

    这里为大家整理了iOS的HTTP请求和请求回执类用法小结,包括发送请求的NSURLRequest、NSMutableURLRequest和负责回复的NSURLResponse类的常用方法和属性,需要的朋友可以参考下
    2016-06-06
  • ios端ijkplayer编译教程

    ios端ijkplayer编译教程

    下面小编就为大家分享一篇ios端ijkplayer编译教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • iOS App开发中Objective-C使用正则表达式进行匹配的方法

    iOS App开发中Objective-C使用正则表达式进行匹配的方法

    这篇文章主要介绍了iOS App开发中Objective-C使用正则表达式进行匹配的方法,文中举了在iOS中验证用户邮箱与手机号的例子,非常实用,匹配需要的朋友可以参考下
    2016-05-05
  • IOS 调整内存中的图片大小实例详解

    IOS 调整内存中的图片大小实例详解

    这篇文章主要介绍了IOS 调整内存中的图片大小实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Objective-C 自定义渐变色Slider的实现方法

    Objective-C 自定义渐变色Slider的实现方法

    系统提供UISlider,但在开发过程中经常需要自定义,本次需求内容是实现一个拥有渐变色的滑动条,且渐变色随着手指touch的位置不同改变区域,这篇文章主要介绍了Objective-C 自定义渐变色Slider,需要的朋友可以参考下
    2024-07-07
  • iOS抽屉效果开发案例分享

    iOS抽屉效果开发案例分享

    这篇文章主要为大家分享了iOS抽屉效果开发案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • iOS中设置清除缓存功能的实现方法

    iOS中设置清除缓存功能的实现方法

    清除缓存基本上都是在设置界面的某一个Cell,于是我们可以把清除缓存封装在某一个自定义Cell中,现在位大家介绍一种最基础的清除缓存的方法,感兴趣的朋友一起看看吧
    2017-07-07
  • iOS开发之手势识别

    iOS开发之手势识别

    本文给大家汇总介绍了在IOS开发中我们经常需要用到的手势识别的相关知识,非常的细致全面,有需要的小伙伴可以参考下
    2016-04-04
  • iOS Runntime 动态添加类方法并调用-class_addMethod

    iOS Runntime 动态添加类方法并调用-class_addMethod

    这篇文章主要介绍了iOS Runntime 动态添加类方法并调用-class_addMethod的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08

最新评论