組件化方案 閱讀筆記

組件

從功能業(yè)務(wù)角度上看不能在查分,適可替換,可復(fù)用的.

模塊

有多個(gè)組件組成,他可以實(shí)現(xiàn)一個(gè)獨(dú)立的功能,一個(gè)或多個(gè)業(yè)務(wù).

例如大眾點(diǎn)評(píng)的美食功能是一個(gè)業(yè)務(wù),也可以叫做"美食模塊".

模塊化開發(fā) 中介者
//Mediator.m 中間件代碼
@implementation Mediator
+ (UIViewController *)OpenViewController1:(NSString *)viewId {
 Class cls = NSClassFromString(@"UIViewController1");
 return [cls performSelector:NSSelectorFromString(@"viewController1:") withObject:@{@"viewId": viewId}];
}
+ (UIViewController *) OpenViewController2:(NSString *) viewId type:(NSInteger)type {
 Class cls = NSClassFromString(@"UIViewController2");
 return [cls performSelector:NSSelectorFromString(@"viewController2:") withObject:@{@"viewId": viewId, @"type": @(type)}];
}
@end
//調(diào)用者
#import "Mediator.h"
@implementation ViewController
- (void)gotoViewController1 {
 UIViewController * vc = [Mediator OpenViewController1:@"id" ];
 [self.navigationController pushViewController: vc animated:YES];
}

- (void) gotoViewController2 {
 UIViewController * vc = [Mediator OpenViewController1:@"id" type:1 ];
 [self.navigationController pushViewController: vc animated:YES];
}
@end

這樣在調(diào)用里面就不用引用 UIViewController1和 UIViewController1 的頭文件了 就不會(huì)產(chǎn)生相互依賴 只要在調(diào)用其他組件的時(shí)候引入 Mediator.h 就可以了.接下來就是優(yōu)化這套寫法,有兩個(gè)優(yōu)化點(diǎn):
1.Mediator 每一個(gè)方法里都要寫 runtime 方法省古,格式是確定的典予,這是可以抽取出來的食磕。
2.每個(gè)組件對(duì)外方法都要在 Mediator 寫一遍,組件一多 Mediator 類的長度是恐怖的鲁捏。

蘑菇街為了補(bǔ)全本地調(diào)用的功能低匙,為組件多加了另一種方案,就是通過 protocol-class 注冊(cè)表的方式亚兄。(感覺比上面的方案要復(fù)雜很多)
首先有一個(gè)新的中間件:

//ProtocolMediator.m 新中間件
@implementation ProtocolMediator
@property (nonatomic, storng) NSMutableDictionary *protocolCache
//注冊(cè)協(xié)議協(xié)議
- (void)registerProtocol:(Protocol *)proto forClass:(Class)cls {
 NSMutableDictionary *protocolCache;
 [protocolCache setObject:cls forKey:NSStringFromProtocol(proto)];
}

- (Class)classForProtocol:(Protocol *)proto {
 return protocolCache[NSStringFromProtocol(proto)];
}
@end

然后有一個(gè)公共Protocol文件,定義了每一個(gè)組件對(duì)外提供的接口:

//ComponentProtocol.h
@protocol BookDetailComponentProtocol <NSObject>
- (UIViewController *)bookDetailController:(NSString *)bookId;
- (UIImage *)coverImageWithBookId:(NSString *)bookId;
@end

@protocol ReviewComponentProtocol <NSObject>
- (UIViewController *)ReviewController:(NSString *)bookId;
@end

再在模塊里實(shí)現(xiàn)這些接口采驻,并在初始化時(shí)調(diào)用 registerProtocol 注冊(cè)审胚。

//BookDetailComponent 組件
#import "ProtocolMediator.h"
#import "ComponentProtocol.h"
#import "WRBookDetailViewController.h"
+ (void)initComponent
{
 [[ProtocolMediator sharedInstance] registerProtocol:@protocol(BookDetailComponentProtocol) forClass:[self class];
}

- (UIViewController *)bookDetailController:(NSString *)bookId {
 WRBookDetailViewController *detailVC = [[WRBookDetailViewController alloc] initWithBookId:param[@"bookId"]];
 return detailVC;
}

- (UIImage *)coverImageWithBookId:(NSString *)bookId {
 ….
}

最后調(diào)用者通過 protocol 從 ProtocolMediator 拿到提供這些方法的 Class,再進(jìn)行調(diào)用:

//WRReadingViewController.m 調(diào)用者
//ReadingViewController.m
#import "ProtocolMediator.h"
#import "ComponentProtocol.h"
+ (void)gotoDetail:(NSString *)bookId {
 Class cls = [[ProtocolMediator sharedInstance] classForProtocol:BookDetailComponentProtocol];
 id bookDetailComponent = [[cls alloc] init];
 UIViewController *vc = [bookDetailComponent bookDetailController:bookId];
 [[UIApplication sharedApplication].keyWindow.rootViewController.navigationController pushViewController:vc animated:YES];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末礼旅,一起剝皮案震驚了整個(gè)濱河市膳叨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌各淀,老刑警劉巖懒鉴,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诡挂,死亡現(xiàn)場離奇詭異碎浇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)璃俗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門奴璃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人城豁,你說我怎么就攤上這事苟穆。” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵雳旅,是天一觀的道長跟磨。 經(jīng)常有香客問我,道長攒盈,這世上最難降的妖魔是什么抵拘? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮型豁,結(jié)果婚禮上僵蛛,老公的妹妹穿的比我還像新娘。我一直安慰自己迎变,他們只是感情好充尉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衣形,像睡著了一般驼侠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谆吴,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天泪电,我揣著相機(jī)與錄音,去河邊找鬼纪铺。 笑死相速,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鲜锚。 我是一名探鬼主播突诬,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼芜繁!你這毒婦竟也來了旺隙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤骏令,失蹤者是張志新(化名)和其女友劉穎蔬捷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榔袋,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡周拐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凰兑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妥粟。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吏够,靈堂內(nèi)的尸體忽然破棺而出勾给,到底是詐尸還是另有隱情滩报,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布播急,位于F島的核電站脓钾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏桩警。R本人自食惡果不足惜惭笑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望生真。 院中可真熱鬧沉噩,春花似錦、人聲如沸柱蟀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽长已。三九已至畜眨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間术瓮,已是汗流浹背康聂。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胞四,地道東北人恬汁。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像辜伟,于是被迫代替她去往敵國和親氓侧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容