Objective-C设计模式——适配器Adapter(接口适配)
2015-07-22 22:09
585 查看
适配器模式
适配器模式通俗来讲,其实就是对客户端添加新的类但却不修改客户端和新的类的接口。此时我们需要自己来实现适配,在适配器模式中有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类
Adapter类
Target协议
客户端
运行结果
例子可能举得不是很恰当,因为实际的客户端应该是一个类,这里主要是为了方便理解这样写。
适配器模式通俗来讲,其实就是对客户端添加新的类但却不修改客户端和新的类的接口。此时我们需要自己来实现适配,在适配器模式中有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];
运行结果
2015-07-22 22:01:16.032 Adapter[725:186663] adaptee target
例子可能举得不是很恰当,因为实际的客户端应该是一个类,这里主要是为了方便理解这样写。
相关文章推荐
- Objective-C学习笔记(五)——数据类型与限定词
- VBA createobject常用对象
- OC基础回顾(七)Foundation Kit 框架
- Objective-C学习笔记(四)——OC实现最简单的数学运算
- 第七天Object类和异常
- 【iOS开发之Objective-C】书签管理器项目
- Object类、JAVA的异常处理机制
- Java的Object类
- 第二周第三天([输入一个字符串,然后输出字符串的运算结果] [object][异常][IO流,读取D盘某个文件])
- Objective-C学习笔记(三)——用Objective-C编写第一个程序:Hello,World!
- asp:ObjectDataSource+asp:GridView 实现真分页
- 刨根问底Objective-C Runtime(4)- 成员变量与属性
- [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第二章~第七章
- 刨根问底Objective-C Runtime(3)- 消息 和 Category
- 刨根问底Objective-C Runtime(2)- Object & Class & Meta Class
- 刨根问底Objective-C Runtime(1)- Self & Super
- NSObject 的实现分析
- Associative机制使用场景[objective-c有两个扩展机制:category扩展方法和associative扩展属性]
- 关于pch文件
- Objective-C GCC Code Block Evaluation C Extension ({…})语法