根據上節的介紹,工程之間傳遞訊息可以新增互相的依賴來實現,不過依賴所能解決的問題有一定的侷限性,
如:bu1 對bu2 需要傳遞訊息,可以新增bu1對bu2的依賴,但是如果同時bu2對bu1也要傳遞訊息時,依賴就無法解決了,下面介紹一種更加系統的方法
注:這種方法只適用於上節介紹的解耦方法,其他的不一定適用,讀者可以根據自己的需要使用
根據上節的介紹
main_project ————>bu1
————>business
main_project ————>bu2
我們要做到main_project 、bu1和bu2之間傳遞訊息,只有business是所有的業務層都能使用到的,也是bu和主工程傳遞訊息的媒介。
在business建立**排程系統bus
@inte***cebus :
nsobject
/*** 各業務bu註冊busojbect到匯流排,方便接收匯流排發起的呼叫
** @param busobj 業務模組的busobject
*/+ (void)register:(busobject *)busobj;
/*** 資料匯流排,跨業務模組同步呼叫
** @param binuessname 業務名
* @param param 呼叫所帶引數,可變長引數,注意引數均為object型別 *
* @return
同步呼叫返回的結果
*/+ (id)calldata:(nsstring *)buinessname param:(nsobject *)param, ... ns_requires_nil_termination;
@end
@inte***ce
bus()
@property (nonatomic, strong) nsmutabledictionary *busobjectmap;
//用於存放對外介面子系統的類關係
@end
static
bus *g_bus;
@implementationbus
+ (void)initializebusifneed );}}
+ (bus *)sharedinstance
+ (busobject *)busobjectforname:(nsstring *)bizname
}busobject *busobj = [busobjectmap valueforkey:findkey];
osspinlockunlock(&spinlock);
if (![busobj iskindofclass:[busobject
class]])
return busobj;
}- (id)init
returnself; }
+ (void)register:(ctbusobject *)busobj
[[bus
sharedinstance
].databusobjectmap
setvalue
:busobj
forkey
:busobj.businessnameprefixandurlhost];
osspinlockunlock(&spinlock);
}+ (id)calldata:(nsstring *)bizname param:(nsobject *)param, ... ns_requires_nil_termination
va_end(argumentlist);
}id ret = [busobj dodatajob:bizname params:paramarr];
return ret;
}@end
在bu1、bu2和main_project中建立對外介面子系統
main_project有乙個對外的mainbusobject
bu1有乙個對外的bu1busobject
bu2有乙個對外的bu2busobject
為了統一結構,所有的bus子系統都需繼承自busobject
@inte***ce busobject : nsobject
@property (nonatomic, readonly) nsstring *businessnameprefixandurlhost;
- (id)initwithhost:(nsstring *)host;
/*** 資料匯流排,同步處理任務,需要子類過載
** @param businessname 業務名
* @param params 引數列表,列表中引數型別為物件
** @return
任務執行結果
*/- (id)dojob:(nsstring *)businessname
params:(nsarray *)params;
@end
@inte***ce
busobject()
@end
@implementationbusobject
- (id)initwithhost:(nsstring *)host
returnself;
}- (nsstring *)businessnameprefixandurlhost
- (id)dojob:(nsstring *)businessname params:(nsarray *)params
@end
當然需要在使用bus之前把所有的子系統都註冊入bus系統
nsdictionary
*busmap =
@;[busmap enumeratekeysandobjectsusingblock:^(id key, id obj, bool *stop) ];
使用方法:
訊息——
傳遞—>bus——
分配—>busobject——
處理—>返回訊息
我們為bu1busobject建立物件
#import "busobject.h"
@inte***ce bu1busobject : busobject
@end
#import "bu1busobject.h"
@implementationbu1busobject
- (id)dojob:(nsstring *)businessname params:(nsarray *)params
}@end
在bu2中只要 [
ctbus
calldata
:@「bu1/hello"param:
nil]
模板用於解耦
一道 c 思考題 std string 的 operator 和 operator 是如何宣告的,如何避免與 iostream 的過度耦合?iostream 和 string 都可以單獨 include 來使用,顯然 iostream 標頭檔案裡不會定義 string 的 和 操作。那麼 strin...
訊息解耦初探
一般來說解耦有兩條途徑,一是遠端請求,二是訊息 推送 這兩種方式可以說使用的應用場景不一樣,比如說遠端請求這是主動方在呼叫方,而推送的主動權肯定是在生產方。為什麼要解耦?這個。如果用訊息進行應用間解耦,訊息將作為應用間的介質作為上下文傳輸。其實知道生產者和消費者就很容易明白,這樣兩個應用之間將不會有...
Egret開發筆記 七 解耦方式之,掛接解耦
需求 首先,需求是這樣的。戰鬥結算介面 就是戰鬥結束後會有乙個介面顯示這場戰鬥的得失 要顯示一些東西。這些東西並不是固定的,比如,今天有可能要顯示 國慶快樂 明天又是要顯示一幅圖。此處將會舉例顯示乙個元件,因為元件上可以放任何你需要顯示的東西。難點如果需要顯示什麼,就手動在這個介面上,加什麼。那麼後...