一,适配器的定义

  • 定义

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

二,适配器的结构图

  实现步骤:

  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. 类ThreadGroup

    Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 默认的情况下,所有的线程都属于主线程组. public final Thread ...

  2. 类TreeMap

    TreeMap类 import java.util.Set; import java.util.TreeMap; public class IntegerDemo { public static vo ...

  3. 编程字体Source Code Pro 免费下载

    对于程序员来说,好的字体应该满足的基本条件: 字母和数字易于分辨,如: 英文字母o 和 阿拉伯数字 0 ,或者 英文字母 l 和 阿拉伯数字 1 ,两个单引号 '' 和双引号 ”. 字体等宽,保持对齐 ...

  4. [19/05/26-星期日] JavaScript_ 基本语法_运算符

    一.概念 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  5. java枚举详解

    枚举的本质是类,枚举是用来构建常量数据结构的模板(初学者可以以此方式理解: public static final X=xxx),枚举的使用增强了程序的健壮性,在引用一个不存在的枚举值的时候,编译器会 ...

  6. ubuntu开机只有一条横杠在闪的解决办法

    1.制作U盘启动盘,并试用ubuntu 2.输入以下命令,根据提示完成修复 sudo add-apt-repository ppa:yannubuntu/boot-repair && ...

  7. SQL在Oracle内部的具体处理流程

         下图显示了SQL在Oracle内部处理的一般阶段:解析.优化.产生行源和执行.数据库可能会忽略某些步骤,这取决于具体的语句.                                 ...

  8. 解决pip源问题 安装不了第三方库问题

    1. 参考链接: https://www.biaodianfu.com/python-pip.html http://blog.csdn.net/u012450329/article/details/ ...

  9. grunt默认只允许localhost和访问,如何设置外部IP地址访问

    转载请注明出处: 猩猩队长  http://www.cnblogs.com/wayns/p/access_grunt_server_from_outside.html 使用Yeoman生成器创建web ...

  10. Python之路-Python中的模块与包

    一.模块简介 在实际开发中我们不可能不用到系统的标准模块,或第三方模块. 如果想实现与时间有关的功能,就需要调用系统的time模块.如果想实现与文件和文件夹有关的操作,就需要要用到os模块. 每一个 ...