装饰设计模式

装饰设计模式动态的添加行为和责任向一个对象而不修改他的任何代码。他是你子类化修改类的行为用通过另一个对象的包装的代替方法。

在Objective-c里面有很多这种设计模式的实现,像category和delegation。

类别

类别是一个极其强大的机制允许你向已经知道的类添加方法不用继承。新方法在编译时间被添加可以像正常方法一样被执行在这个扩展类里面。这个和类的修饰定义有稍微的不同。因为类别不能添加实例 变量。

注意:除了扩展自己的类,你还可以向任何cocoa自己的类添加方法。

怎么用类别:

想象一个场景你有一个专辑对象这个专辑对象想展示在tableView里面。

专辑的标题从哪里来?专辑是一数据对象,因此不关心怎么展示数据。你需要一些额外的代码向专辑类添加这个功能,但是不需要直接修改这个类的代码。

我们给已经存在的专辑类添加一个类别;他将定义一个新的方法返回显示在tableView里面的数据结构。

这个数据结构像下面这样:

给专辑类添加类别。在新建文件选择类别模版而不是Objective-c类模版然后写上类别的名字和将给哪个类创建类别的名字。

注意:这时候你注意新文件的名字了吗?是 Album+TableRepresentation意味着你对Album类扩展。这个机制很重要的,因为他容易阅读和防止与你或者其他的人创建的类别冲突。

在Album+TableRepresentation头文件添加下面方法原型:

- (NSDictionary*)tr_tableRepresentation;

注意在方法的名字前面添加tr_。作为一个类别的名字TableRepresentation缩写。同样这样的机制有主意和其他方法冲突。

注意:如果在这个类别里面定义的方法的名字和原始类方法名义一样或者和另一个在同一个类的类别方法名字一样(甚至超类)。在运行时方法实现提示行为是未定义的。如果在你自己类里面使用类别这是不太可能出现的问题。但是当向cocoa已经存在的类里面添加类别可能会出现严重的问题。

在Album+TableRepresentation.m添加下面方法实现:

- (NSDictionary*)tr_tableRepresentation

{

return @{@"titles":@[@"Artist", @"Album", @"Genre", @"Year"],

@"values":@[self.artist, self.title, self.genre, self.year]};

}

这个设计模式的强大作用:

1:可以直接从Album直接使用属性。

2:你有添加到专辑类但你没有从它派生出子类。如果你需要子类专辑,你仍然可以这么做。

3:这个简单的添加返回一个在tableView里面的专辑类,不需要修改专辑的代码。

苹果在foundation框架里面用了很多的类别。想看到他们打开NSString找到@interface NSString,并且你将要看到三个类别定义在这个类里面。类别帮助我们组织方法和把方法分割成区。

来自英文教程翻译谢绝转载!!!未经允许不得转载维权必究!!!

IOS设计模式第四篇之装饰设计模式的类别设计模式的更多相关文章

  1. IOS设计模式第五篇之装饰设计模式的代理设计模式

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 代理: 另一个装饰设计模式,代理,是一个代表或者协调另一个对象的行为机制.例如当你用一个tableView,你必须实现他里面的一个tableView ...

  2. Python开发【第十四篇】装饰器

    装饰器 什么是装饰器? ​ 装饰器是一个函数,主要作用是用来给包装另一个函数或者类 包装的目的是不改变原函数名(或类名)的情况下改变或添加被包装对象的功能 函数装饰器 是指装饰器是一个函数,传入的是一 ...

  3. IOS UI 第四篇:基本UI

    ViewController 应用   再第一个XIB页面创建另一个XIB页面,并且通过按钮调用它     - (IBAction)GoSecond:(id)sender {    secondVie ...

  4. JAVA设计模式---总述篇

    一.设计模式(Design Pattern): 1.设计模式的概念 是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及 ...

  5. 小菜学习设计模式(四)—原型(Prototype)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  6. C#设计模式之总结篇

    一.引言     C#版本的23种设计模式已经写完了,现在也到了一个该总结的时候了.说起设计模式,我的话就比较多了.刚开始写代码的时候,有需求就写代码来解决需求,如果有新的需求,或者需求变了,我就想当 ...

  7. Java 设计模式系列(八)装饰者模式

    Java 设计模式系列(八)装饰者模式 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.Decorator 或 Wrapper 一.装饰模 ...

  8. 深入探索Java设计模式(三)之装饰器模式

    装饰器模式使你可以在运行时使用类似于对象组成的技术来装饰类.这在我们希望实例化具有新职责的对象而无需对基础类进行任何代码更改的情况下尤其有用.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题 ...

  9. 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

      设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的 ...

随机推荐

  1. e789. 限制用JSpinner实现数字选择的值

    // Create a number spinner that only handles values in the range [0,100] int min = 0; int max = 100; ...

  2. Java设计模式六大原则之场景应用分析

    定义:不要存在多于一个导致类变更的原因. 通俗的说.即一个类仅仅负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而须要改动类T时,有可能会导致原本执行正 ...

  3. ASP.NET 网站超时跳转到登录界面

    利用actionFilter过滤器实现,超时跳转到登录界面 /// <summary> /// 登录超时跳转至登录界面 /// </summary> public class ...

  4. 互联网公司GitHub repo 语言使用情况

    转自: https://laike9m.com/blog/hu-lian-wang-gong-si-github-repo-yu-yan-shi-yong-qing-kuang,56/ 现在基本上所有 ...

  5. POI-PPT官方文档

    注意 请注意,XSLF仍然处于早期开发阶段,并且将来会在发行版中发生不兼容的更改. 特征索引 创建新的演示文稿 阅读现有演示文稿 使用预定义的布局创建幻灯片 删除幻灯片 重新订购幻灯片 更改幻灯片大小 ...

  6. 正则表达式sed

    sed  能实现grep查找的功能,还可以替换指定的字符. 匹配查找文件中root字符(其中的 -n表示段落,p表示打印出来print) [root@localhost sed]# sed -n '/ ...

  7. jquery获取data-xxx自定义属性的值遇到的问题

    直接用jquery的 data("name") 获取 data-name的值有问题,获取的只是最初的值,即使后边改变也不会变,所以还是要用attr("data-name& ...

  8. vue select二级城市联动及第二级默认选中第一个option值

    当二级联动比如选择国家的时候,希望选中一个国家的时候后面城市默认选中第一个城市,则给国家的select加一个@change事件就可以了 <div class="inputLine&qu ...

  9. 在ABBYY中如何修正倾斜的PDF页面

    作为一名文案工作者,每天都要跟各种PDF文件打交道,合同.报价单.协议书等等等,通常提供给客户的都是扫描之后的PDF文档,虽说都是机器扫描,但毕竟是人为放置的,难免位置放置不齐,导致扫描出来的文档出现 ...

  10. MathType让矩阵中的小数以小数点对齐的教程

    用MathType编辑公式时,有很多模板都可以应用,并且这些模板并不是只有一种用途,比如矩阵.矩阵模板可以用来编辑矩阵也可是用来编辑一些需要排列组合的数据等等.在用MathType编辑矩阵时,如果里面 ...