iOS设计模式 - 适配器

效果

说明

1. 为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信.

2. 本教程实现了适配器模式的类适配器与对象适配器两种模式,各有优缺点.

3. 如果对面向对象基本原理以及设计模式基本原理不熟悉,本教程会变得难以理解.

源码

https://github.com/YouXianMing/iOS-Design-Patterns

//
// BusinessCardView.h
// Adapter
//
// Created by YouXianMing on 15/7/25.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import <UIKit/UIKit.h>
#import "BusinessCardAdapterProtocol.h" #define BUSINESS_FRAME CGRectMake(0, 0, 200, 130) @interface BusinessCardView : UIView /**
* 名字
*/
@property (nonatomic, strong) NSString *name; /**
* 线条颜色
*/
@property (nonatomic, strong) UIColor *lineColor; /**
* 电话号码
*/
@property (nonatomic, strong) NSString *phoneNumber; /**
* 加载数据(实现了BusinessCardAdapterProtocol协议的数据)
*
* @param data 实现了BusinessCardAdapterProtocol协议的数据
*/
- (void)loadData:(id <BusinessCardAdapterProtocol>)data; @end
//
// BusinessCardView.m
// Adapter
//
// Created by YouXianMing on 15/7/25.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import "BusinessCardView.h" @interface BusinessCardView () @property (nonatomic, strong) UILabel *nameLabel;
@property (nonatomic, strong) UIView *lineView;
@property (nonatomic, strong) UILabel *phoneNumberLabel; @end @implementation BusinessCardView #pragma mark - 初始化
- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame];
if (self) { [self setup];
} return self;
} - (void)setup { self.backgroundColor = [UIColor whiteColor];
self.layer.borderWidth = 0.5f;
self.layer.shadowOpacity = 0.5f;
self.layer.shadowOffset = CGSizeMake(, );
self.layer.shadowRadius = .f;
self.layer.shadowColor = [UIColor grayColor].CGColor; self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
self.nameLabel.font = [UIFont fontWithName:@"Avenir-Light" size:.f];
[self addSubview:self.nameLabel]; self.lineView = [[UIView alloc] initWithFrame:CGRectMake(, , , )];
[self addSubview:self.lineView]; self.phoneNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
self.phoneNumberLabel.textAlignment = NSTextAlignmentRight;
self.phoneNumberLabel.font = [UIFont fontWithName:@"AvenirNext-UltraLightItalic" size:.f];
[self addSubview:self.phoneNumberLabel];
} - (void)loadData:(id <BusinessCardAdapterProtocol>)data { self.name = [data name];
self.lineColor = [data lineColor];
self.phoneNumber = [data phoneNumber];
} #pragma mark - 重写setter,getter方法
@synthesize name = _name;
@synthesize lineColor = _lineColor;
@synthesize phoneNumber = _phoneNumber; - (void)setName:(NSString *)name { _name = name;
_nameLabel.text = name;
} - (NSString *)name { return _name;
} - (void)setLineColor:(UIColor *)lineColor { _lineColor = lineColor;
_lineView.backgroundColor = _lineColor;
} - (UIColor *)lineColor { return _lineColor;
} - (void)setPhoneNumber:(NSString *)phoneNumber { _phoneNumber = phoneNumber;
_phoneNumberLabel.text = phoneNumber;
} - (NSString *)phoneNumber { return _phoneNumber;
} @end
//
// BusinessCardAdapter.h
// NormalProblem
//
// Created by YouXianMing on 15/7/25.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "BusinessCardAdapterProtocol.h" @interface BusinessCardAdapter : NSObject <BusinessCardAdapterProtocol> /**
* 输入对象
*/
@property (nonatomic, weak) id data; /**
* 与输入对象建立联系
*
* @param data 输入的对象
*
* @return 实例对象
*/
- (instancetype)initWithData:(id)data; @end
//
// BusinessCardAdapter.m
// NormalProblem
//
// Created by YouXianMing on 15/7/25.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import "BusinessCardAdapter.h" @implementation BusinessCardAdapter - (instancetype)initWithData:(id)data { self = [super init];
if (self) { self.data = data;
} return self;
} - (NSString *)name { return nil;
} - (UIColor *)lineColor { return nil;
} - (NSString *)phoneNumber { return nil;
} @end
//
// BusinessCardAdapterProtocol.h
// NormalProblem
//
// Created by YouXianMing on 15/7/25.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h> @protocol BusinessCardAdapterProtocol <NSObject> - (NSString *)name; - (UIColor *)lineColor; - (NSString *)phoneNumber; @end

分析

这是基于BusinessCardView构建出来的必不可少的抽象适配器以及一个协议,通过继承抽象适配器来实现具体的适配器,协议是用来统一接口.

对象适配器与类适配器.

客户端(BusinessCardView)只与适配器进行通信,它不关心数据源 NormalModel 与 SpecialModel 的业务逻辑

此处的抽象是核心所在

iOS设计模式 - 适配器的更多相关文章

  1. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

  2. iOS书摘之Objective-C编程之道 iOS设计模式解析

    来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...

  3. iOS 设计模式

    很赞的总结 iOS Design Patterns 中文版 IOS设计模式之一(MVC模式,单例模式) IOS设计模式之二(门面模式,装饰器模式) IOS设计模式之三(适配器模式,观察者模式) IOS ...

  4. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  5. iOS设计模式之生成器

    iOS设计模式之生成器 1.生成器模式的定义 (1): 将一个复杂的对象的构件与它的表示分离,使得相同的构建过程能够创建不同的表示 (2): 生成器模式除了客户之外还包括一个Director(指导者) ...

  6. IOS设计模式之三:MVC模式

    IOS设计模式之三:MVC模式   模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...

  7. iOS设计模式 - 享元

    iOS设计模式 - 享元 原理图 说明 享元模式使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件.通常物件中的部分 ...

  8. iOS设计模式 - 责任链

    iOS设计模式 - 责任链 原理图 说明 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链 ...

  9. iOS设计模式 - 模板

    iOS设计模式 - 模板 原理图 说明 定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤. 源码 https://github.c ...

随机推荐

  1. maven上传源码到私服

    上传源码 项目中采用了分模块的方式构建,直接将maven-source-plugin写到父pom中,尝试了很多次发现源码一直不能上传到私服中,纠结了很长时间才发现原来多模块项目和普通一个项目的配置是有 ...

  2. js--常量,变量

    常量 内存中的一个的固定的地址,其中的数值也是固定的 变量 内存的一个地址,其中的内容有我们更改维护 值类型与引用类型 改变值类型的变量时,影响值的变量 全大写的名称一般为常量 var a = 1 v ...

  3. jQuery插件开发之windowScroll

    回首望,曾经洋洋得意的代码现在不忍直视.曾经看起来碉堡的效果现在也能稍微弄点出来.社会在往前发展,人也得向前迈进. 参考于搜狗浏览器4.2版本首页的上下滚动效果.主要实现整个窗口的上下和左右滚动逻辑, ...

  4. dll ocx cab IE 自动安装

    我们打开淘宝等网站时,IE浏览器会提示安装空间,这个控件便是用于对用户名密码进行加密的ActiveX控件.如何在我们的站点上安装如此控件,让用户可以通过简单的点击便可方便使用我们的空间呢? 下面是如何 ...

  5. 《Think Python》第17章学习笔记

    目录 <Think Python>第17章学习笔记 17.1 面向对象的特性(Object-oriented features) 17.2 打印对象(Printing objects) 1 ...

  6. 布局xml里面所有元素详解

    被坑惨了,为了去掉一个元素,被各种莫名其妙的问题坑惨了.把所有常用到的都记录下来,不要再被坑到了 tools:context:http://blog.csdn.net/xiabing082/artic ...

  7. xml布局中include的使用

    参考:http://blog.csdn.net/harvic880925/article/details/17263275 include_button1.xml <?xml version=& ...

  8. 使用原生JavaScript实现对select增加option标签并附加value属性

    好久没有写原生的东西了,今天写了一个小项目里面包含着option选项,所以我决定使用原生JavaScript动态生成, 本着互联网分享精神,我将本篇文章分享给大家. html代码(就是一个select ...

  9. JavaScript内置对象与原生对象【转】

    原文:https://segmentfault.com/a/1190000002634958 内置对象与原生对象 内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始化 ...

  10. Java自学-初识

    1.Java介绍 Java是一种开发语言,人和人说话用嘴说,人和计算机说话就靠开发语言.Java编写的程序可以让计算机执行一些列命令,达到人们想要的目的.比如说想要统计一年消费情况,如果人工统计,就要 ...