装饰设计模式

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

在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. PHP usort 使用用户自定义的比较函数对数组中的值进行排序

    From: http://www.php100.com/cover/php/2395.html usort (PHP 4, PHP 5) usort — 使用用户自定义的比较函数对数组中的值进行排序 ...

  2. jQuery实现一个淡入淡出下拉菜单 非常简易

    前段时间我一直在向大家推荐CSS3和HTML5的东西,尽管看上去很炫,但也有不少网友抱怨兼容性问题,所以今天开始我也会陆续向大家介绍一些兼容性较好的jQuery插件.今天先分享一款利用jQuery实现 ...

  3. Scala学习笔记——入门

    0.在 scala> 下运行Scala程序 首先cd到.scala文件所在的目录下 scalac这个scala文件,然后import package的名字.object的名字 然后就能使用 ob ...

  4. Tomcat介绍 安装jdk 安装Tomcat

    Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开发而 ...

  5. Objc将数据写入iOS真机的plist文件里

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 怎样写入模拟器的博文在 这里 可是这对真机无论用,由于在真机环 ...

  6. js 1+'2' == '1'+'2'

    前言 非常深入地讲解了包含隐式转换时js计算过程,全篇干货.本文由@keenjaan授权分享. 本文由@仙人掌推荐分享 正文从这里开始 你有没有在面试中遇到特别奇葩的js隐形转换的面试题,第一反应是怎 ...

  7. UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数

    lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序).对于这 ...

  8. 【VirtualBox】共享文件夹失效问题

    fix: sudo ln -f -s /opt/VBoxGuestAdditions-5.1.20/lib/VBoxGuestAdditions/mount.vboxsf /sbin/mount.vb ...

  9. mysql日期问题

    1.在java中,在当前时间的基础上增加30天.Date d = new Date();   SimpleDateFormat df = new SimpleDateFormat("yyyy ...

  10. wingIDE设置支持中文注释

    用wingIDE快2年了,实在是受不了不支持中文,每次中文都报错,一个小逗号也要查很久,别说中文注释了,在网上找解决办法,原来这么简单! 下面,把破解放大和支持中文支持的方法备份下来,以便以后查看. ...