适配器模式

适配器模式通俗来讲,其实就是对客户端添加新的类但却不修改客户端和新的类的接口。此时我们需要自己来实现适配,在适配器模式中有Target对象,即客户端所需要的接口对象,Adaptee对象,即需要适配的对象,中间需要Adapter对象来进行适配。简单来说,客户端要用某个类的接口,但是和客户端所用的通用接口不一致,此时就需要适配器来统一接口供客户端调用。适配器模式一般在后期维护客户端的时候才会用到,因为初期肯定不会出现设计接口不一致的问题(不过也可能是代码复用导致了不一致)。适配其有两种,一种是类适配器,一种是对象适配器。类适配器就是让适配器对象继承要被适配的对象,从而用子类来扩展新方法完成适配,而对象适配器就是持有需要适配的对象引用来自定义方法完成适配。

应用场景

1.已有类的接口与需求不一致。

2.想要一个可复用的类,该类能够同可能带有不兼容接口的其他类协作。

3.需要适配一个类的几个不同子类,可是让每一个子类去子类化一个类适配器又不现实,那么可以使用对象适配器(也叫委托)来适配其父类的接口。

类对象适配与对象适配器的区别

类适配器

只针对单一的具体Adaptee类,把Adaptee适配到Target。

易于重载Adaptee的行为,因为是通过直接的子类化进行的适配。

只有一个Adapter对象,无需额外的指针间接访问。

对象适配器

可以适配对个Adaptee以及其子类。

难以重载Adaptee的行为,需要借助于子类对象而不是Adaptee本身。

需要额外的指针以间接访问Adaptee并适配其行为。

iOS中的委托设计模式

对于委托模式,其实本身就是适配器。客户端就是iOS的框架类,Target就是代理协议,Adaptee就是Controller中的自定义类,Adapter就是实现协议的类。

比如说UITableView类,我们在控制器中写的对象是不可以直接和UITableView交流的,需要适配器,那么实现了Delegate的Controller就是一个适配器,UITableController本身就是客户端对象。

不过委托设计模式和适配器还是有一些区别的,委托对象同时会持有委托发起对象的引用,所以这里会有相会引用,这也是为什么delegate属性一般都是weak的原因。

Demo

Adaptee类

#import <Foundation/Foundation.h>

@interface Adaptee : NSObject

@property (nonatomic, strong)NSString *name;

-(void)sayName;

@end

#import "Adaptee.h"

@implementation Adaptee

-(id)init{

    self = [super init];
if(self)
{
_name = @"adaptee target";
}
return self;
} -(void)sayName{ NSLog(@"%@",self.name); } @end

Adapter类

#import <Foundation/Foundation.h>
#import "Target.h"
#import "Adaptee.h" @interface Adapter : NSObject<Target> @property (nonatomic ,strong)Adaptee *adaptee; @end #import "Adapter.h" @implementation Adapter -(void)speakName
{
[self.adaptee sayName];
} @end

Target协议

#import <Foundation/Foundation.h>

@protocol Target <NSObject>

@required
-(void)speakName; @end

客户端

        Adaptee *adaptee = [Adaptee new];
Adapter *adapter = [Adapter new];
adapter.adaptee = adaptee;
id<Target> target = adapter;
[target speakName];

运行结果

-- ::16.032 Adapter[:] adaptee target

例子可能举得不是很恰当,因为实际的客户端应该是一个类,这里主要是为了方便理解这样写。

Objective-C设计模式——适配器Adapter(接口适配)的更多相关文章

  1. 设计模式--适配器(Adapter)模式

    今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...

  2. 设计模式 适配器-Adapter

    适配器模式:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 直接上图.下面是对象适配器的类图.由于Java不支持多继承.所以这是Java的适配器实现方式. 结合H ...

  3. 设计模式 - 适配器模式(adapter pattern) 具体解释

    适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...

  4. OC编程之道-接口适配之适配器

    已有的类与新的接口之间不兼容的问题相当普遍,人们已为它找到了一个解决方案.这个解决方案就是适配器. 1 何为适配器 what 适配器的主要作用是把被适配者的行为传递给管道另一端的客户端. 将一个类的接 ...

  5. Ruby设计模式透析之 —— 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  6. 设计模式学习心得<适配器 Adapter>

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接 ...

  7. 2、适配器 adapter 模式 加个"适配器" 以便于复用 结构型设计模式

    1.什么是适配器模式? 适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的,但是电脑后面的插孔却不能直接插到插线板上. 如果想让额定工作电压是直流12伏特的笔记 ...

  8. Objective-C设计模式——外观Faced(接口适配)

    外观模式 外观设计模式和适配器差不多,不过它门对对象控制的粒度不同,适配器一般只是控制一个系统和客户端的对接.外观则是用来抽象多个系统一起工作. 外观一般具有多个子系统,所以外观应持有多个子系统的引用 ...

  9. 理解什么是适配器(adapter)和接口(interface)

    ● 适配器(adapter) In computing, adapter is a hardware device or software component that converts transm ...

随机推荐

  1. COGS2479(四维偏序)

    题意:给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 分析:cdq分治 ...

  2. C#中使用 Oracle的事务与存储过程

    1 存储过程 1.1 不带参数,没有返回值 创建表 create table test (ID number, NAME varchar2(), SEX varchar2(), AGE number, ...

  3. Android GIS开发系列-- 入门季(13)Gdal简单写个shp文件

    Gdal是用来读写栅格与矢量数据的,在Gdal官网,可以下载相关的资源进行平台的编译.其实Arcgis底层也是用Gdal来读取shp文件的,那在Android中可以直接读写shp文件吗,是可以的.这里 ...

  4. 如何查看sqlalchemy执行的原始sql语句?

    SQLAlchemy打开SQL语句方法如下,echo=true将开启该功能: engine = create_engine("<db_rul>", echo=True) ...

  5. C#写的NoSQL开源项目/系统(系列)

    http://www.cnblogs.com/unruledboy/archive/2013/01/07/CSharpNoSQL.html 闲扯 好久没写开源项目了,也没写对新开源项目的介绍,今晚看了 ...

  6. Hadoop HDFS NFS GateWay部署深入具体解释

    目的:通过挂载的方式,能够相似訪问本地磁盘的方式一样的訪问Hadoop文件.简单.方便.快捷. 0.系统版本号&hadoop版本号 1)系统版本号 [root@WEB-W031 sbin]# ...

  7. 怎样用ccache加速cocos2d-x android版本号的编译

    下面步骤在MAC下測试通过: 首先是安装CCache, 能够用homebrew brew install --HEAD ccache 也能够用源代码安装 git clone https://githu ...

  8. 用C# (.NET Core) 实现抽象工厂设计模式

    用C# (.NET Core) 实现抽象工厂设计模式   本文的概念性内容来自深入浅出设计模式一书. 上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/ ...

  9. 混合式框架-AgileLite

    Agile Lite是一个HTML5移动前端框架.支持jQuery和Zepto双引擎.而且提供与UI无关的独立框架,内置了Flat UI样式和Ratchet样式.同一时候也支持单页模式和多页模式开发. ...

  10. msyql索引详解

    一.mysql查询表索引命令两种形式 1.mysql>SHOW INDEX FROM 'biaoming' 2.mysql>SHOW keys FROM 'biaoming' 运行结果如下 ...