本文試圖探討以下三個(gè)問(wèn)題
- 什么是類(lèi)簇
- 使用類(lèi)簇有什么好處
- 類(lèi)簇的具體應(yīng)用
1. 什么是類(lèi)簇
類(lèi)簇的英文名是class cluster滞谢,cluster本意是一群串稀,一組的意思,簡(jiǎn)單的說(shuō)類(lèi)簇就是一組類(lèi)狮杨,是一組什么什么樣的類(lèi)呢母截? 官方文檔是這么說(shuō)的:
A class cluster is an architecture that groups a number of private, concrete subclasses under a public, abstract superclass. The grouping of classes in this way provides a simplified interface to the user, who sees only the publicly visible architecture.
大概意思就是說(shuō)類(lèi)簇模式是包含了一組私有的具體的類(lèi),這些類(lèi)繼承一個(gè)公開(kāi)的抽象類(lèi)橄教,也即是基類(lèi)清寇,基類(lèi)負(fù)責(zé)提供對(duì)外接口供調(diào)用者使用喘漏,具體類(lèi)負(fù)責(zé)方法的真正實(shí)現(xiàn), 我們只需要調(diào)用基類(lèi)提供的接口來(lái)實(shí)現(xiàn)相關(guān)功能华烟,而無(wú)需關(guān)心背后的具體實(shí)現(xiàn)細(xì)節(jié)翩迈。
用代碼表示如下:
// 基類(lèi)提供一個(gè)工廠方法返回具體的實(shí)例對(duì)象
[AbstractClass *concreteObj] = [AbstractClass ClasssWithType:type]
// 調(diào)用基類(lèi)提供的方法
[concreteObj AbstractClassMehod]
舉個(gè)例子在UIButton這個(gè)類(lèi)下面有一個(gè)工廠方法
(UIButton *)buttonWithType:(UIButtonType)Type,調(diào)用這個(gè)方法可以返回具體的實(shí)例類(lèi)盔夜,此時(shí)UIbutton就是一個(gè)抽象的基類(lèi)负饲,返回的是他子類(lèi)的實(shí)例,然后我們?cè)僬{(diào)用基類(lèi)提供的接口完成相關(guān)邏輯
// 返回子類(lèi)的實(shí)例
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];
// 我們只需要調(diào)用基類(lèi)提供的方法喂链,而不關(guān)心具體子類(lèi)的實(shí)現(xiàn)
[button setImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];**
假設(shè)一下如果沒(méi)有使用類(lèi)簇模式的話(huà)返十,上面的代碼可能寫(xiě)成
RoundedRectButton *button =[RoundedRectButton alloc] init];
[button setImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal]
假如子類(lèi)很多, 我們需要針對(duì)每個(gè)子類(lèi)都有一種寫(xiě)法椭微,如下圖所示
使用類(lèi)簇有什么好處洞坑?
至此我們大概可以知曉,使用類(lèi)簇對(duì)于開(kāi)發(fā)者而言很方便維護(hù)和拓展赏表,具體的實(shí)現(xiàn)代碼放在對(duì)應(yīng)的子類(lèi)里检诗,假如我們想再拓展,只需要繼承子類(lèi)瓢剿,重寫(xiě)對(duì)外的接口即可逢慌,對(duì)于調(diào)用者而言十分簡(jiǎn)單明了,不用去關(guān)心子類(lèi)是如何實(shí)現(xiàn)间狂,只需要調(diào)用基類(lèi)提供的接口即可攻泼。
具體實(shí)踐
到了愉快的碼代碼時(shí)間了,假設(shè)我們接到一個(gè)需求
用戶(hù)點(diǎn)擊下載按鈕鉴象,如果下載成功顯示成功的提醒忙菠,下載失敗顯示一個(gè)按鈕允許用戶(hù)點(diǎn)擊后再次下載,那么我們可以按照下列實(shí)現(xiàn)
思路:
1.創(chuàng)建一個(gè)基類(lèi)HintView纺弊,實(shí)現(xiàn)一個(gè)工廠方法牛欢,根據(jù)傳入的不同值生成不同的的子類(lèi)實(shí)例 ,并定義一個(gè) showToView: 接口淆游,由子類(lèi)具體實(shí)現(xiàn)方法
2.創(chuàng)建兩個(gè)子類(lèi)SuccessHintView傍睹,F(xiàn)ailHintView,分別根據(jù)下載成功和失敗的情況實(shí)現(xiàn)具體的showshowToView:方法
具體實(shí)現(xiàn)犹菱,
1.定義一個(gè)基類(lèi)
HintView.h
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger,HintViewType){
HintViewTypeSuccess,
HintViewTypeFail
};
@interface HintView : NSObject
+ (HintView *)viewWithType:(HintViewType)type;
- (void)showToView:(UIView *)view;
@end
HintView.m
@implementation HintView
+ (HintView *)viewWithType:(HintViewType)type{
HintView *view = nil;
switch (type) {
case HintViewTypeSuccess:{
view= [[SuccessHintView alloc] init];
break;
}
case HintViewTypeFail:{
view= [[FailHintView alloc] init];
break;
}
}
return view;
}
- (void)showToView:(UIView *)view {
// subClass implement this
};
2.然后分別在對(duì)應(yīng)的子類(lèi)實(shí)現(xiàn)方法
SuccessHintView.m文件
#import "SuccessHintView.h"
@implementation SuccessHintView
- (void)showToView:(UIView *)view{
CGPoint center = view.center;
UILabel *lable = [[UILabel alloc] init];
lable.frame = CGRectMake(0, 0, 200, 200);
lable.center = center;
lable.textAlignment = NSTextAlignmentCenter;
lable.backgroundColor = [UIColor redColor];
[view addSubview:lable];
lable.text = @"恭喜你下載成功";
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[lable removeFromSuperview];
});
}
FailHintView.m文件
#import "FailHintView.h"
@implementation FailHintView
- (void)showToView:(UIView *)view{
CGPoint center = view.center;
UIButton *button = [[UIButton alloc] init];
button.frame = CGRectMake(0, 0, 200, 100);
button.center = center;
[view addSubview:button];
[button setTitle:@"下載失敗拾稳,點(diǎn)擊我重試" forState:UIControlStateNormal];
button.backgroundColor = [UIColor redColor];
[button addTarget:self action:@selector(didCLickButton:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)didCLickButton:(UIButton *)button{
[button removeFromSuperview];
}
相關(guān)代碼可以在我的github查看https://github.com/atony2099/ClassCluste