适配器模式

适配器模式通俗来讲,其实就是对客户端添加新的类但却不修改客户端和新的类的接口。此时我们需要自己来实现适配,在适配器模式中有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. angularJS 系列(七)

    In AngularJS 1.3+, there is One-time binding built-in: The main purpose of one-time binding expressi ...

  2. Bundle格式文件的安装

    安装VMware Workstation for Linux,文件是Bundle格式,安裝如下: 1 su要先取得root權限2hmod +x VMware-Workstation-Full-7.1. ...

  3. js location对象相关命令

    Location.href 返回整个当前url,若对其赋值:location.href="http://www.sina.com.cn"则跳转其urllocation.host 返 ...

  4. JavaScript你所不知道的困惑(1)

    困惑一: 先看一个样例: function test(){ message = "hi"; } test(); alert(message); 会输出字符串"hi&quo ...

  5. Google's Hybrid Approach to Research

    文档地址:戳我 总结: (i) aims to generate scientific and engineering advances in fields of import to Google, ...

  6. HIbernate- SQLQuery 简易

    package cn.demo; import java.util.Arrays; import java.util.List; import org.hibernate.SQLQuery; impo ...

  7. Aaron Swartz Rewriting Reddit中关于web.py的创建思路

    这天才少年居然自杀了,哎 原文点这 So how should things work? The first principle is that code should be clear and si ...

  8. 利用JFreeChart生成区域图 (5) (转自 JSP开发技术大全)

    利用JFreeChart生成区域图 (5) (转自 JSP开发技术大全) 14.5 利用JFreeChart生成区域图 通过JFreeChart插件只能生成普通效果的区域图,利用工厂类ChartFac ...

  9. [Codeforces 1037D] Valid BFS?

    [题目链接] http://codeforces.com/problemset/problem/1037/D [算法] 首先求出每个点的父节点 , 每棵子树的大小 然后判断BFS序是否合法即可 时间复 ...

  10. POJ2749 Building road

    传送门 这道题真是2-SAT好题啊!!卡了我两个点才做完……垃圾POJ还不告诉我哪错了…… 首先我们先花一段时间把题看懂……(其实是翻译一下),之后我们发现因为每个谷仓只能向一个中转点连边,所以他就是 ...