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设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...
随机推荐
- Arduino入门之前
胡乱乱的,就买了,这个 arduino的板子. 哎...本来明明是 学动漫的,然后 不小心就开始 做软件了,然后 越跑越偏...现在 开始 做 硬件开发了... 其实 还有 树莓派 可供选择,算了,不 ...
- YOLOv3 算法的详细说明
YOLOv3没有太多的创新,主要是借鉴一些好的方案融合到YOLO里面.不过效果还是不错的,在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力. 本文主要讲v3的改进,由于是以v1和 ...
- 微信小程序---》分包加载
[小程序]---分包加载 一.分包加载 某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载 在构建小程序分包项目时,构建会输出一个或多个分包.每个使 ...
- Netty解码的艺术
什么是拆包/粘包: TCP 粘包/拆包: TCP 是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP 作为传输层协议并不了解上层业务数据的具体含义,它会根据TCP 缓冲区的实际情况进行数 ...
- 【转载】研发应该懂的binlog知识(下)
引言 这篇是<研发应该懂的binlog知识(上)>的下半部分.在本文,我会阐述一下binlog的结构,以及如何使用java来解析binlog.不过,话说回来,其实严格意义上来说,研发应该还 ...
- ubuntu终端代理之proxychains
命令行代理 安装proxychains sudo apt install proxychains 配置proxychains sudo vim /etc/proxychains.conf 在proxy ...
- POJ-3122.Pie(二分法最大化平均值)
二分法的主题思路就是逐步逼近,所以这道题的思路自然一目了然,做题思路也是... 本题大意:题主过生日,它买了N块半径为R[ i ],高为1的圆柱形蛋糕,现在他要将这N块蛋糕等分给F + 1个人,为了好 ...
- ajax传文件用express的multer接住
html部分: //input type设为file <input type="file" name="file" id="fileInputE ...
- org.springframework.beans.BeanUtils的用法
s,t为对象BeanUtils.copyProperties(s, t); 将给定源bean的属性值复制到目标bean中 public static void copyProperties(Obje ...
- [常用类]Number & Math 类(转载)
下面的表中列出的是 Number & Math 类常用的一些方法: 序号 方法与描述 1 xxxValue() 将 Number 对象转换为xxx数据类型的值并返回. 2 compareTo( ...