一,什么是装饰模式

  • 模式定义

    装饰者包含被装饰者的所有接口和引用,方法实现完全是引用调用自己的方法,在装饰者子类添加新功能。

    注释:

    Category不要重写被装饰对象的方法,否则改变了被装饰对象的行为,不符合装饰者模式,只可适用特殊场景。分类主要用于对被装饰者类的方法和属性拓展
  • 需求场景
    静态库扩展功能。不改变(原始类)、不继承、动态扩展功能。
    • 不知道原始类实现细节,只提供接口,动态扩展功能。
    • 不想有更多子类,不想通过继承的方式添加功能。
    • 动态扩展对象的功能。
    • 必须持有对象的引用,包含实例化的被装饰类。

二,装饰模式结构图

  实现方式:

  1. 定义装饰者类,并在.h定义被装饰者类中的所有暴漏到.h的方法(也可以添加自定义的操作方法)和对被装饰者类的引用。
  2. 在装饰者类用用被装饰者对象对其方法调用,已输出我们想要的结果。
  3. 如果想拓展被装饰者类,可通过分类的方法,这样可以不破坏被装饰者类原生逻辑。  

三,代码示例

  • Target(被装饰者类)

    • Target.h

      @interface Target : NSObject
      /**
      * 游戏币的数量
      */
      @property(nonatomic,assign) NSInteger coin; /**
      * 上下左右的操作
      */
      - (void)up; - (void)down; - (void)left; - (void)right;
      /**
      * 选择与开始的操作
      */
      - (void)select;
      - (void)start;
      /**
      * 按钮 A + B 的操作
      */
      - (void)commandA;
      - (void)commandB;
      @end
    • Target.m
      @implementation Target
      
      - (void)up{
      NSLog(@"up");
      } - (void)down{
      NSLog(@"down");
      } - (void)left{
      NSLog(@"left");
      } - (void)right{
      NSLog(@"right");
      } - (void)select { NSLog(@"select");
      } - (void)start { NSLog(@"start");
      } - (void)commandA { NSLog(@"commandA");
      } - (void)commandB { NSLog(@"commandB");
      } @end  
  • Decorator(装饰者类)

    • Decorator.h

      #import <Foundation/Foundation.h>
      
      NS_ASSUME_NONNULL_BEGIN
      
      @interface Decorator : NSObject
      
      #pragma mark --被装饰者类方法
      
      @property (nonatomic) NSInteger coin;
      
      - (void)up;
      - (void)down;
      - (void)left;
      - (void)right;
      - (void)select;
      - (void)start;
      - (void)commandA;
      - (void)commandB; #pragma mark - 以下为装饰对象新添加的功能 /**
      * 剩余几条命
      */
      @property (nonatomic, readonly) NSInteger lives; /**
      * 作弊 (上下上下左右左右ABAB)
      */
      - (void)cheat; @end
    • Decorator.m
      #import "Decorator.h"
      #import "Target.h"
      @interface Decorator() @property (nonatomic,strong) Target target; //持有被装饰者类对象 @end @implementation Decorator #pragma mark - 初始化 - (instancetype)init { if (self = [super init]) { // 装饰对象包含一个真实对象的引用
      self.target = [Target new];
      } return self;
      } #pragma mark - 让真实对象的引用执行对应的方法 - (void)up { [_target up];
      } - (void)down { [_target down];
      } - (void)left { [_target left];
      } - (void)right {
      [_target right];
      } - (void)select {
      [_target select];
      } - (void)start { [_target start];
      } - (void)commandA { [_target commandA];
      } - (void)commandB { [_target commandB];
      } #pragma mark - 装饰器新添加的方法
      - (void)cheat {
      [_target up];
      [_target down];
      [_target up];
      [_target down];
      [_target left];
      [_target right];
      [_target left];
      [_target right];
      [_target commandA];
      [_target commandB];
      [_target commandA];
      [_target commandB];
      } @synthesize lives = _lives;
      - (NSInteger)lives {
      // 相关处理逻辑
      return ;
      } @end

四,装饰模式优缺点

  • 优点
    在不改变目标类业务逻辑的情况下,拓展原有的方法和功能

五,demo

  装饰者模式

iOS设计模式之装饰者模式的更多相关文章

  1. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  2. C#设计模式(9)——装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

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

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

  4. 设计模式之装饰者模式-java实例

    设计模式之装饰者模式 需求场景 我们有了别人提供的产品,但是别人提供的产品对我们来说还不够完善,我们需要对这个产品的功能进行补强,此时可以考虑使用装饰者模式. 我们已经有了产品,而且这个产品的功能非常 ...

  5. iOS设计模式 - (3)简单工厂模式

    iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/ ...

  6. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  7. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  8. PHP设计模式之装饰器模式(Decorator)

    PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...

  9. 实践GoF的23种设计模式:装饰者模式

    摘要:装饰者模式通过组合的方式,提供了能够动态地给对象/模块扩展新功能的能力.理论上,只要没有限制,它可以一直把功能叠加下去,具有很高的灵活性. 本文分享自华为云社区<[Go实现]实践GoF的2 ...

随机推荐

  1. cmath模块——复数域数学函数模块

    cmath——复数域数学函数模块 转自:https://blog.csdn.net/zhtysw/article/category/7511293 该模块属于内置模块,随时可以调用.它提供了数学函数在 ...

  2. [转]Hook executed successfully but returned HTTP 403

    原文地址:https://www.cnblogs.com/chenglc/p/11174530.html jenkins配置gitlab的webhook,完成配置,测试结果显示 Hook execut ...

  3. WEB安全----XSS和CSRF

    随着Web2.0.社交网络.微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起黑客们的强烈关注,接踵 ...

  4. [eclipse中使用Git插件] 008 - git操作pull、merge、stash、commit

    写在前面: 看标题其实还有001-007之类,本来准备写详细的类似教程一样的东东,但是懒了且时间有限(以后或许会补吧),所以跳到008,录下主要的操作. 所以本随笔的重点就是[pull+merge+s ...

  5. P2747 [USACO5.4]周游加拿大Canada Tour

    题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直到你到达最东边的城市,再由东向西返回,直到你回到开始的城市.除了旅 ...

  6. 简单写入excel

    import pymysql,xlwt def to_excel(table_name): host, user, passwd, db = '127.0.0.1', 'root', '123', ' ...

  7. CVE-2014-4014 Linux Kernel Local Privilege Escalation PoC

    /**  * CVE-2014-4014 Linux Kernel Local Privilege Escalation PoC  *  * Vitaly Nikolenko  * http://ha ...

  8. TCL自动化之SSH交互式

    目前ssh工具很多,但是能够轻松运用到自动化脚本中,可以轻松适配任何环境,满足ssh交互式登录的tcl工具包很少 下面是个人在tcl自动化过程中比较满意的一款自动化脚本 通过使用管道方式分装plink ...

  9. git账号失效问题解决

    linux开发机上,使用某人账号,进行代码同步.该员工离职,导致该git账号不可用. 此时需要完成3步配置: 1.生成新的公私秘钥:在~/.ssh/config中把私钥文件路径 append到文件末尾 ...

  10. springcloud费话之配置中心基础(SVN)

    目录: springcloud费话之Eureka基础 springcloud费话之Eureka集群 springcloud费话之Eureka服务访问(restTemplate) springcloud ...