类簇是objective-C系统框架普遍使用的模式,可以隐藏抽象基类背后的实现细节。比如创建按钮时调用的
+ (instancetype)buttonWithType:(UIButtonType)buttonType;
这个方法创建的对象的类型取决于传入的按钮类型buttonType
。返回的对象都继承于同一个基类UIButton
。
当各个子类在外部表现相同,内部实现不同时,我们就可以使用类簇模式去实现它。这样做我们无需使用对应的子类,只需要使用基类即可。
创建类簇
举个例子,我们要写个刷新控件,实现下拉刷新,上拉加载功能。
定义抽象基类
typedef enum {
RefreshStateBeginRefreshing,//开始刷新
RefreshStateEndRefreshing//结束刷新
} RefreshState;
/**
控件类型
*/
typedef enum {
RefreshHeaderType,
RefreshFooterType
} RefreshViewType;
@interface XZHRefreshView : UIView
- (void)addRefreshTarget:(id)target action:(SEL)action forRefreshState:(RefreshState)state;
+ (XZHRefreshView *)refreshViewWithType:(RefreshViewType)type;
@end
@implementation XZHRefreshView
+ (XZHRefreshView *)refreshViewWithType:(RefreshViewType)type {
if (type == RefreshHeaderType) {
return [XZHRefreshHeaderView header];
} else if (type == RefreshFooterType) {
return [XZHRefreshFooterView footer];
} else {
return nil;
}
}
- (void)addRefreshTarget:(id)target action:(SEL)action forRefreshState:(RefreshState)state {
//子类实现
}
@end
每个实体子类,都是继承于基类:
@interface XZHRefreshHeaderView : XZHRefreshView
@end
@implementation XZHRefreshView
- (void)addRefreshTarget:(id)target action:(SEL)action forRefreshState:(RefreshState)state {
//code
}
@end
OC语言不能指出哪个基类是『抽象的』。开发者需要在文档中写明类的用法。基类没有init
方法,不应该由使用者直接创建。
注意事项
1.所有子类应该继承类簇的抽象基类
2.子类应该覆写父类需要覆写的方法。
3.使用类簇时要完善开发文档,避免团队成员错误使用。