服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - 详解Objective-C编程中对设计模式中的适配器模式的使用

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

2021-01-12 15:58Gof Lee IOS

这篇文章主要介绍了Objective-C编程中对设计模式中的适配器模式的使用,适配器模式中的Adapter适配器允许接口不兼容的类在一起工作,需要的朋友可以参考下

引言

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

定义

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

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

结构图

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

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

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

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

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

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

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

 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.想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。

延伸 · 阅读

精彩推荐
  • IOSiOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)

    iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和

    这篇文章主要介绍了iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)的相关资料,需要的朋友可以参考下...

    CodingFire13652021-02-26
  • IOS详解iOS中多个网络请求的同步问题总结

    详解iOS中多个网络请求的同步问题总结

    这篇文章主要介绍了详解iOS中多个网络请求的同步问题总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    liang199111302021-03-15
  • IOSiOS开发之视图切换

    iOS开发之视图切换

    在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单。在iOS开发中常用的视图切换有三种,今天我们将...

    执着丶执念5272021-01-16
  • IOSiOS开发技巧之状态栏字体颜色的设置方法

    iOS开发技巧之状态栏字体颜色的设置方法

    有时候我们需要根据不同的背景修改状态栏字体的颜色,下面这篇文章主要给大家介绍了关于iOS开发技巧之状态栏字体颜色的设置方法,文中通过示例代码...

    梦想家-mxj8922021-05-10
  • IOSiOS实现控制屏幕常亮不变暗的方法示例

    iOS实现控制屏幕常亮不变暗的方法示例

    最近在工作中遇到了要将iOS屏幕保持常亮的需求,所以下面这篇文章主要给大家介绍了关于利用iOS如何实现控制屏幕常亮不变暗的方法,文中给出了详细的...

    随风13332021-04-02
  • IOSiOS中UILabel实现长按复制功能实例代码

    iOS中UILabel实现长按复制功能实例代码

    在iOS开发过程中,有时候会用到UILabel展示的内容,那么就设计到点击UILabel复制它上面展示的内容的功能,也就是Label长按复制功能,下面这篇文章主要给大...

    devilx12792021-04-02
  • IOSiOS自定义UICollectionViewFlowLayout实现图片浏览效果

    iOS自定义UICollectionViewFlowLayout实现图片浏览效果

    这篇文章主要介绍了iOS自定义UICollectionViewFlowLayout实现图片浏览效果的相关资料,需要的朋友可以参考下...

    jiangamh8882021-01-11
  • IOSiOS中MD5加密算法的介绍和使用

    iOS中MD5加密算法的介绍和使用

    MD5加密是最常用的加密方法之一,是从一段字符串中通过相应特征生成一段32位的数字字母混合码。对输入信息生成唯一的128位散列值(32个字符)。这篇文...

    LYSNote5432021-02-04