iOS设计模式之适配器模式
一,适配器的定义
- 定义
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
- 需求场景
需要使用以前开发的“一些现存的对象”,但是新环境中要求的接口是这些现存对象所不满足的
二,适配器的结构图
实现步骤:
- 定义接口,规范适配器的功能
- 定义适配器父类,便于各个子类的对于接口功能的实现
- 子类适配器继承父类适配器,实现子类下的接口功能
- 父类指针指向子类,调用子类的实现方法
结构图:
三,代码示例
- 接口协议
- CellPhoneProtocol.h
/**
* @brief 面向接口编程,协议负责定义适配接口
*/
@protocol CellPhoneProtocol <NSObject>
- (NSString *)name;
- (NSString *)playMusic;
- (NSString *)playMovie;
- CellPhoneProtocol.h
- 父类适配器
- CellPhone.h
@interface CellPhone : NSObject<CellPhoneProtocol>
@property(nonatomic,strong) id data; //生成子类接受数据的变量
- (instancetype)initWithData:(id)data; //便于子类接受数据源
@end - CellPhone.m
#import "CellPhone.h" @implementation CellPhone
- (instancetype)initWithData:(id)data {
if (self = [super init]) {
self.data = data; //接受数据源数据
}
return self;
} #pragma mark --Protocol Methods
- (NSString *)name { //便于子类重写实现
return nil;
}
- (NSString *)playMusic { //便于子类重写实现
return nil;
}
- (NSString *)playMovie { //便于子类重写实现
return nil;
}
@end
- CellPhone.h
- 子类适配器
- Ios
- Ios.h
@interface Ios : CellPhone
@end - Ios.m
@implementation Ios
- (NSString *)name {
IosModel *iosModel = (IosModel *)self.data;
return iosModel.name;
} - (NSString *)playMovie {
IosModel *iosModel = (IosModel *)self.data;
return iosModel.movieName;
} - (NSString *)playMusic {
IosModel *iosModel = (IosModel *)self.data;
return iosModel.musicName;
}
@end
- Ios.h
- Android
- Android.h
@interface Android : CellPhone
@enAndroid.m - Android.m
@implementation Android
- (NSString *)name {
AnroidModel *andriodModel = (AnroidModel *)self.data;
return andriodModel.name;
}
- (NSString *)playMovie {
AnroidModel *andriodModel = (AnroidModel *)self.data;
return andriodModel.movieName;
}
- (NSString *)playMusic {
AnroidModel *andriodModel = (AnroidModel *)self.data;
return andriodModel.musicName;
}
@end
- Android.h
- WPhone
- WPhone.h
@interface WPhone : CellPhone
@enWPhone.m - WPhone.m
@implementation WPhone
- (NSString *)name {
WPhoneModel *wphoneModel = (WPhoneModel *)self.data;
return wphoneModel.name;
}
- (NSString *)playMovie {
WPhoneModel *wphoneModel = (WPhoneModel *)self.data;
return wphoneModel.movieName;
}
- (NSString *)playMusic {
WPhoneModel *wphoneModel = (WPhoneModel *)self.data;
return wphoneModel.musicName;
}
@end
- WPhone.h
- ViewController
#import "ViewController.h" #import "CellPhone.h" #import "Ios.h"
#import "IosModel.h" #import "Android.h"
#import "AnroidModel.h" #import "WPhone.h"
#import "WPhoneModel.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
[self adapterWphone]; NSLog(@"%@",[self.delegate name]);
NSLog(@"%@",[self.delegate playMovie]);
NSLog(@"%@",[self.delegate playMusic]);
} //适配iOS
- (void)adapterIos {
//数据源
IosModel *iosModel = [[IosModel alloc]init];
iosModel.name = @"iOS";
iosModel.musicName = @"iOS--音乐";
iosModel.movieName = @"iOS--电影"; //父类指针指向子类对象
CellPhone *cellPhone = [[Ios alloc] initWithData:iosModel];
self.delegate = cellPhone;
} //适配andriod
- (void)adapterAndriod {
//数据源
AnroidModel *anroidModel = [[AnroidModel alloc]init];
anroidModel.name = @"Andriod";
anroidModel.musicName = @"Andriod--音乐";
anroidModel.movieName = @"Andriod--电影"; //父类指针指向子类对象
CellPhone *cellPhone = [[Ios alloc] initWithData:anroidModel];
self.delegate = cellPhone;
} //适配Wphone
- (void)adapterWphone {
//数据源
WPhoneModel *wphoneModel = [[WPhoneModel alloc]init];
wphoneModel.name = @"WPhone";
wphoneModel.musicName = @"WPhone--音乐";
wphoneModel.movieName = @"WPhone--电影"; //父类指针指向子类对象
CellPhone *cellPhone = [[Ios alloc] initWithData:wphoneModel];
self.delegate = cellPhone;
}
- (void)setDelegate:(id<CellPhoneProtocol>)delegate {
_delegate = delegate;
}
@end - 打印结果
-- ::08.203781+ AdapterPattern[:] WPhone
-- ::08.203983+ AdapterPattern[:] WPhone--电影
-- ::08.204108+ AdapterPattern[:] WPhone--音乐
- Ios
四,优缺点
- 优点:
解耦合,让视图类不合数据类产生耦合,使视图类更加独立。 新增加数据类的时候不需要修改视图类。
- 缺点:
会新增加很多类,使系统更凌乱,代码可读性更弱了。
五,demo
AdapterPattern
iOS设计模式之适配器模式的更多相关文章
- iOS设计模式 - 适配器
iOS设计模式 - 适配器 效果 说明 1. 为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信. 2. 本教程实现了适配器模式的类适配器与对象适配器两种 ...
- iOS书摘之Objective-C编程之道 iOS设计模式解析
来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...
- iOS 设计模式
很赞的总结 iOS Design Patterns 中文版 IOS设计模式之一(MVC模式,单例模式) IOS设计模式之二(门面模式,装饰器模式) IOS设计模式之三(适配器模式,观察者模式) IOS ...
- iOS设计模式 - (1)概述
近期可自由安排的时间比較多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 由于我自己是搞iOS的, 所以之后设 ...
- 每天一个设计模式-3 适配器模式(Adapteer)
每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来 ...
- Head First 设计模式之适配器模式与外观模式
Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...
- C#设计模式(7)——适配器模式(Adapter Pattern)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
- IOS设计模式之一(MVC模式,单例模式)
iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...
- iOS 设计模式之工厂模式
iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...
随机推荐
- PHP 的源码编译安装
PHP 架构和安装扩展的几种方式 PHP 三大模块: SAPI:接受并处理请求. Zend Engine:PHP 的核心,负责分析 PHP 代码并转为 opcode,然后在 Zend VM 虚拟机上执 ...
- 删除C:\Program Files (x86)\Common Files\baidu 等误装软件且正常模式删不掉的文件夹
---------方法一-------- C:\Program Files\Common Files\Baidu\BaiduProtect\1.1.0.26打开以上路径找到反注册程序uninst.ex ...
- Linux-档案权限概念
第一欄代表這個檔案的類型與權限(permission): 這個地方最需要注意了!仔細看的話,你應該可以發現這一欄其實共有十個字元:(圖5.2.1及圖5.2.2內的權限並無關係) 圖5.2.2.檔案的類 ...
- python中5个json库的速度对比
python中json的序列化与反序列化有很多库,具体选择使用哪一个,或者哪一个速度更快呢? 先上结果 json序列化与反序列化速度对比(按总时间排序:测试数据100 * 10000) ujson 序 ...
- 使用pyautogui替代selenium,图像识别进行web自动化测试--基于python语言
这里演示一下使用pyautogui替代selenium进行web自动化测试,并不建议使用pyautogui进行web自动化测试,因为元素的ui一旦有长宽变化,或者风格的变化,执行时就会发生异常,仅当学 ...
- 如何解决IIS配置HTTPS证书后刷新消失问题
IIS配置CER证书后完成证书申请后刷新后就会消失的这个BUG微软一直存在,因为我们一般申请都是下来的CER文件和私钥 但是IIS只支持PFX文件的导入,所以我们需要把CER文件和证书私钥转换成PFX ...
- Reverse Linked List(反转单向链表)
来源:https://leetcode.com/problems/reverse-linked-list Reverse a singly linked list. 递归方法:递归调用直到最后一个节点 ...
- Appium+Python之测试数据与脚本分离
如果脚本中有很多的魔法数据,那代码的复用性就不会很高,所以我们需要将测试数据和脚本分离. 思路:将测试数据放在一个json文件中,然后写一个读取json文件的基类,测试用例中通过调基类中方法来获取js ...
- SpringDataJPA使用
一.简介 SpringDataJpa是 JPA规范的一个很好的实现,简化了开发的复杂度,极大提升了开发的效率.SpringDataJpa通过 Repository接口及子接口可以很方便的实现持久化操作 ...
- c知识点总结2
函数 int func(int x){ //x:形式参数 .... } int main(){ .... int res=func(z); //z:实际参数 } 实参与形参具有不同的存储单元, 实参与 ...