首页 > 代码库 > IOS设计模式第四篇之装饰设计模式的类别设计模式
IOS设计模式第四篇之装饰设计模式的类别设计模式
装饰设计模式
装饰设计模式动态的添加行为和责任向一个对象而不修改他的任何代码。他是你子类化修改类的行为用通过另一个对象的包装的代替方法。
在Objective-c里面有很多这种设计模式的实现,像category和delegation。
类别
类别是一个极其强大的机制允许你向已经知道的类添加方法不用继承。新方法在编译时间被添加可以像正常方法一样被执行在这个扩展类里面。这个和类的修饰定义有稍微的不同。因为类别不能添加实例 变量。
注意:除了扩展自己的类,你还可以向任何cocoa自己的类添加方法。
怎么用类别:
想象一个场景你有一个专辑对象这个专辑对象想展示在tableView里面。
专辑的标题从哪里来?专辑是一数据对象,因此不关心怎么展示数据。你需要一些额外的代码向专辑类添加这个功能,但是不需要直接修改这个类的代码。
我们给已经存在的专辑类添加一个类别;他将定义一个新的方法返回显示在tableView里面的数据结构。
这个数据结构像下面这样:
给专辑类添加类别。在新建文件选择类别模版而不是Objective-c类模版然后写上类别的名字和将给哪个类创建类别的名字。
注意:这时候你注意新文件的名字了吗?是 Album+TableRepresentation意味着你对Album类扩展。这个机制很重要的,因为他容易阅读和防止与你或者其他的人创建的类别冲突。
在Album+TableRepresentation头文件添加下面方法原型:
#import "Album.h"
@interface Album (TableRepresentation)
- (NSDictionary*)tr_tableRepresentation;
@end
注意在方法的名字前面添加tr_。作为一个类别的名字TableRepresentation缩写。同样这样的机制有主意和其他方法冲突。
注意:如果在这个类别里面定义的方法的名字和原始类方法名义一样或者和另一个在同一个类的类别方法名字一样(甚至超类)。在运行时方法实现提示行为是未定义的。如果在你自己类里面使用类别这是不太可能出现的问题。但是当向cocoa已经存在的类里面添加类别可能会出现严重的问题。
在Album+TableRepresentation.m添加下面方法实现:
#import "Album+TableRepresentation.h"
@implementation Album (TableRepresentation)
- (NSDictionary*)tr_tableRepresentation
{
return@{@"titles":@[@"Artist",@"Album", @"Genre",@"Year"],
@"values":@[self.artist,self.title,self.genre,self.year]};
}
@end
这个设计模式的强大作用:
1:可以直接从Album直接使用属性。
2:你有添加到专辑类但你没有从它派生出子类。如果你需要子类专辑,你仍然可以这么做。
3:这个简单的添加返回一个在tableView里面的专辑类,不需要修改专辑的代码。
苹果在foundation框架里面用了很多的类别。想看到他们打开NSString找到@interface NSString,并且你将要看到三个类别定义在这个类里面。类别帮助我们组织方法和把方法分割成区。
IOS设计模式第四篇之装饰设计模式的类别设计模式