一,适配器的定义

  • 定义

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

二,适配器的结构图

  实现步骤:

  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. CDN分发

    CDN 是Content Delivery Network,即内容分发网络. 未完待续..

  2. docker进阶——数据管理与网络

    一.数据卷管理 用户在使用 Docker 的过程中,势必需要查看容器内应用产生的数据,或者 需要将容器内数据进行备份,甚至多个容器之间进行数据共享,这必然会涉及 到容器的数据管理 (1)Data Vo ...

  3. Delphi 遍历类中的属性

    http://blog.csdn.net/easyboot/article/details/8004954 Delphi 遍历类中的属性 标签: delphistringbuttonclassform ...

  4. 从Android手机中取出已安装的app包,导出apk

    从Android手机中取出已安装的app包,导出apk TAG:Android,提取,apk,adb,pm,root,导出apk 假设有这样一个场景,A君看到你手机上一个实用APP,想要安装到自己手机 ...

  5. 【AndroidFramework】【EMMC拷机】混合拷机时盒子待机

    [AndroidFramework][EMMC拷机]混合拷机时盒子待机 问题结论 暂时确定为误按键,不是故障.问题关闭.后续完全保证无按键(物理隔离)情况下如果出现待机,请反馈. 问题描述 [EMMC ...

  6. 【BASIS系列】SAP 批量锁住用户和TCODE的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BASIS系列]SAP 批量锁住用户和TCOD ...

  7. 如何搭建Vue环境?

    搭建vue的开发环境: https://cn.vuejs.org/v2/guide/installation.html 1.     必须要安装nodejs cnpm  下载包的速度更快一些. 地址: ...

  8. chineseocr项目的配置阶段出现的问题及解决方案

    chineseocr为GitHub上的一个开源项目,主要使用yolos,crnn等深度学习框架训练好后的模型使用.测试结果发现,不管是针对文本文件.表格文件.还是场景图,如身份证火车票,识别效果都比较 ...

  9. 分享一篇Linux系统使用Tomcat服务时交互式修改server.xml中端口号的shell脚本

    #!/bin/bash echo -e '\n' echo "***********************************" port1=`grep -r "s ...

  10. python之callable

    callback是python的内置函数 英文说明: callable(object) Return True If the object argument appears callable,Fals ...