一,适配器的定义

  • 定义

    将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
  • 需求场景
    需要使用以前开发的“一些现存的对象”,但是新环境中要求的接口是这些现存对象所不满足的

二,适配器的结构图

  实现步骤:

  1. 定义接口,规范适配器的功能
  2. 定义适配器父类,便于各个子类的对于接口功能的实现
  3. 子类适配器继承父类适配器,实现子类下的接口功能
  4. 父类指针指向子类,调用子类的实现方法  

结构图:

三,代码示例

  • 接口协议

    • CellPhoneProtocol.h

      /**
      * @brief 面向接口编程,协议负责定义适配接口
      */
      @protocol CellPhoneProtocol <NSObject>
      - (NSString *)name;
      - (NSString *)playMusic;
      - (NSString *)playMovie;
  • 父类适配器
    • 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
  • 子类适配器
    • 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
    • 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
    • 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
    • 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--音乐

四,优缺点

  • 优点:
    解耦合,让视图类不合数据类产生耦合,使视图类更加独立。 新增加数据类的时候不需要修改视图类。
  • 缺点:
    会新增加很多类,使系统更凌乱,代码可读性更弱了。

五,demo  

AdapterPattern

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

  1. iOS设计模式 - 适配器

    iOS设计模式 - 适配器 效果 说明 1. 为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信. 2. 本教程实现了适配器模式的类适配器与对象适配器两种 ...

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

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

  3. iOS 设计模式

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

  4. iOS设计模式 - (1)概述

    近期可自由安排的时间比較多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 由于我自己是搞iOS的, 所以之后设 ...

  5. 每天一个设计模式-3 适配器模式(Adapteer)

    每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来 ...

  6. Head First 设计模式之适配器模式与外观模式

    Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...

  7. C#设计模式(7)——适配器模式(Adapter Pattern)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

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

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

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

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

随机推荐

  1. gradle implementation runtimeOnly 和api 区别

    implementation  不对外开发,只是本项目依赖. runtimeOnly 运行时才依赖 api 可以传递依赖,别的项目也可以依赖api的jar包.

  2. 16/7/7_PHP-面向对象关键词

    转载地址: http://blog.sina.com.cn/s/blog_5182b171010092fb.html PHP5 是一具备了大部分面向对象语言的特性的语言,比PHP4 有了很多的面向对象 ...

  3. 爬楼梯问题,yield学习总结

    问题起源: 一个人爬楼梯,一步可以迈一级,二级,如果楼梯有N级,要求编写程序,求总共有多少种走法. 简单的一个递归思想,只要爬到了N-1层,或者爬到N-2层,则认定下一步只有一种走法.所以再去找寻N- ...

  4. 【ABAP系列】SAP ABAP WS_DELIVERY_UPDATE 修改数量、过账日期并发货过账

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP WS_DELI ...

  5. mysql-schema-sync同步两个实例

    参考:https://github.com/hidu/mysql-schema-sync 需求:测试环境表结构变动同步到开发环境,两个实例各有数百个库,不适合每个库写一个配置文件 环境:操作系统ubu ...

  6. SpringBoot官方文档学习(二)使用Spring Boot构建系统

    强烈建议您选择一个支持依赖关系管理并且可以使用发布到“ Maven Central”仓库的构建系统.我们建议您选择Maven或Gradle.其他构建系统(例如,Ant)也可以和Spring Boot一 ...

  7. linux驱动模型——platform(1)

    一.驱动模型包含什么? 1.1. 类class 1.1.2. 它能够自动创建/dev下的设备节点,不需要mknod /dev/xxx c x x创建.当然class还有其另外的作用,且自动创建设备节点 ...

  8. Python 中的作用域?

    Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定. 当 Python 遇到一个变量的话,它会按照这的顺序进行搜索:本地作用域(Local)--->当前作用域被嵌入的本地作用域( ...

  9. td内容超出 以…显示

    table中的td内容超出以省略号显示,需满足的条件是: <style type="text/css"> table{ table-layout: fixed; bor ...

  10. python编程基础之简单购物车

    #good文件夹内容[ ['Iphone7', 5800], ['Coffee', 30], ['疙瘩汤', 10], ['Python Book', 99], ['Bike', 199], ['Vi ...