装饰设计模式

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

在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. Java数组排序和插入

    如何排序数组并插入元素? 以下示例显示如何使用sort()方法和用户定义的insertElement()方法来完成此任务. package com.yiibai; import java.util.* ...

  2. e797. 显示JSlider的标记

    The slider supports two levels of tick marks, major and minor. Typically, the minor tick-mark spacin ...

  3. Build opencv libraries for android arm, x86 ubuntu

    废话不多说. 准备工作: 1. 下载源代码: http://opencv.org/ 编译平台:ubuntu14.04 opencv 2.4.6.1 本人用这样的办法编译了opecv 2.4.9 的没有 ...

  4. HttpClient后台post 请求webapi

    1.请求方法 /// <summary> /// httpClient 请求接口 /// </summary> /// <param name="url&quo ...

  5. Spring中初始化bean和销毁bean的时候执行某个方法的详解

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过注解@PostConstruct  和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 ...

  6. Linux+Apache+PHP+MySQL服务器环境(CentOS篇)

    1.前言 CentOS(Community ENTerprise Operating System)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定 ...

  7. Kong安装简介

    评价:其实是一个整合型的方案,从它的安装页面看:http://getkong.org/download/#other该方案基于OpenResty,和lua 提供的功能是统一的Oauth认证.rest封 ...

  8. chrome浏览器表单自动填充默认样式(背景变黄)-autofill

    之所以出现这样的样式, 是因为Chrome会自动为input增加如下样式. 这个样式的优先级也比较高. 无法通过important覆盖(这就比较恶心了). 解决方案(3种): 1. 关闭自动保存账号密 ...

  9. CSS z-index优先级

    可以设置div层与层之间的优先级,上下层覆盖优先情况. 当你定义的CSS中有position属性值为absolute.relative或fixed, 用z-index取值方可生效. 如果想要一个小的d ...

  10. Thinkphp部署

    环境nginx,apache,iis naginx环境需要: apache需要: iis需要: 项目入口 1.根目录("/") 2.多级目目录(“/public”) 静态文件 静态 ...