装饰设计模式

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

在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,并且你将要看到三个类别定义在这个类里面。类别帮助我们组织方法和把方法分割成区。

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

最新文章

  1. Scala override
  2. crack a router
  3. 缺陷管理系统mantisbt环境搭建
  4. MVC学习Day02之校验
  5. [流媒体]VLC主要模块
  6. Html类ImageGetter接口
  7. Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案
  8. 3.3html学习笔记之链接
  9. delphi 插入表格HTML代码
  10. Android应用资源--之属性(Attribute)资源
  11. Pandas简易入门(二)
  12. tinyXml在linux下的使用
  13. 一款很不错的FLASH时种插件
  14. Call-time pass-by-reference has been deprecated
  15. The Swift Programming Language-官方教程精译Swift(4)字符串和字符
  16. ES6入门
  17. Ubuntu14.04配置3389远程桌面连接
  18. Windows下安装Python扩展模块提示Unable to find vcvarsall.bat的问题
  19. Linux 链接详解----动态链接库
  20. ES5.0集群搭建

热门文章

  1. Miniconda 安装测试
  2. u3d一个GameObject绑定两个AudioSource
  3. maven中snapshot快照库和release发布库的区别和作用 (转)
  4. 腾讯大渝网(esf.cq.qq.com)任意手机注册+短信验证码泄露
  5. mocha框架下,异步测试代码错误造成的问题----用例超时错误
  6. UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
  7. git恢复本地删除的文件夹取消增加的文件
  8. 关系型数据库 和 非关系型数据对比 以及 MySQL与Oracle对比
  9. PHP 数组current和next用法
  10. IE每次关闭都提示IE已停止工作