何為中介者模式?
面向?qū)ο蟮脑O計鼓勵把行為分散到不同對象中,這種分散可能導致對象之間的相互關聯(lián)。在最糟糕的情況下,所有對象都彼此了解并相互操作。
雖然把行為分散到不同對象增強了可復用性,但是增加的相互關聯(lián)又減少了獲得的益處。增加的關聯(lián)使得對象很難或不能在不依賴其他對象的情況下工作。應用程序的整體行為可能難以進行任何重大修改,因為行為分布于許多對象。于是結(jié)果可能是創(chuàng)建越來越多的子類,以支持應用程序中的任何新行為。
中介者模式:用一個對象來封裝一系列對象的交互方式。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
何時使用中介者模式?
1.對象間的交互雖定義明確然而非常復雜,導致一組對象彼此依賴而且難以理解。
2.因為對象引用了許多其他對象并與其通訊,導致對象難以復用。
3.想要定制一個分布在多個類中的邏輯或行為,又不想生成太多的子類。
中介者模式的實現(xiàn)示例:
下面先給出類結(jié)構(gòu)圖,再做簡單解釋。
中介者模式很容易在系統(tǒng)中引用,但是也比較容易誤用。所以當系統(tǒng)出現(xiàn)了“多對多”交互復雜的對象群時,不要急于使用中介者模式,而要先反思系統(tǒng)在設計上是不是合理。
下面我們來說一說,中介者模式的優(yōu)缺點。中介者的優(yōu)點首先是mediator的出現(xiàn)減少了各個colleague的耦合,使得可以獨立地改變和復用各個colleague類和mediator。其次,由于把對象如何協(xié)作進行了抽象,將中介作為一個獨立的概念并將其封裝在一個對象中,這樣關注的對象就從對象各自本身的行為轉(zhuǎn)移到它們之間的交互上來,也就是站在一個更宏觀的角度去看待系統(tǒng)。
相對來說,缺點也很明顯。由于concretemediator控制了集中化,于是就把交互復雜性變?yōu)榱酥薪檎叩膹碗s性,這就使得中介者會變得比任何一個concretecolleage都復雜。所以一旦concretemediator崩潰,那么整個系統(tǒng)都會受到影響。
還是那句老話,世上沒有銀彈,合適的就是最好的!
下面給大家簡單展示一下具體實現(xiàn)。
注意:本文所有代碼均在arc環(huán)境下編譯通過。
mediator類接口
#import <foundation/foundation.h>
@class colleague;
@interface mediator :nsobject
-(void)send:(nsstring*)message
:(colleague*)colleague;
@end
mediator類實現(xiàn)
#import "mediator.h"
@implementation mediator
-(void)send:(nsstring *)message :(colleague *)colleague{
return;
}
@end
colleague類接口
#import <foundation/foundation.h>
@class mediator;
@interface colleague :nsobject{
mediator *mymediator;
}
-(colleague*)myinit:(mediator*)mediator;
@end
colleague類實現(xiàn)
#import "colleague.h"
@implementation colleague
-(colleague*)myinit:(mediator *)mediator{
if (self == [super init]) {
mymediator = mediator;
}
return self;
}
@end
concretemediator類接口
#import "mediator.h"
@class concretecolleague1;
@class concretecolleague2;
@interface concretemediator :mediator
@property concretecolleague1*colleague1;
@property concretecolleague2*colleague2;
@end
concretemediator類實現(xiàn)
#import "concretemediator.h"
#import "concretecolleague1.h"
#import "concretecolleague2.h"
#import "colleague.h"
@implementation concretemediator
@synthesize colleague1;
@synthesize colleague2;
-(void)send:(nsstring *)message :(colleague *)colleague{
if ([colleague iskindofclass:[concretecolleague1 class]]) {
[colleague2 notify:message];
}
else {
[colleague1 notify:message];
}
}
@end
concretecolleague1類接口
#import "colleague.h"
@class mediator;
@interface concretecolleague1 :colleague
-(concretecolleague1*)myinit:(mediator*)mediator;
-(void)send:(nsstring*)message;
-(void)notify:(nsstring*)message;
@end
concretecolleague1類實現(xiàn)
#import "concretecolleague1.h"
#import "mediator.h"
@implementation concretecolleague1
-(concretecolleague1*)myinit:(mediator*)mediator{
if (self == [super init]) {
mymediator = mediator;
}
return self;
}
-(void)send:(nsstring *)message{
[mymediator send:message :self];
}
-(void)notify:(nsstring *)message{
nslog(@"concretecolleague1 got message:%@", message);
}
@end
concretecolleague2類接口
#import "colleague.h"
@class mediator;
@interface concretecolleague2 :colleague
-(concretecolleague2*)myinit:(mediator*)mediator;
-(void)send:(nsstring*)message;
-(void)notify:(nsstring*)message;
@end
concretecolleague2類實現(xiàn)
#import "concretecolleague2.h"
#import "mediator.h"
@implementation concretecolleague2
-(concretecolleague2*)myinit:(mediator*)mediator{
if (self == [super init]) {
mymediator = mediator;
}
return self;
}
-(void)send:(nsstring *)message{
[mymediator send:message :self];
}
-(void)notify:(nsstring *)message{
nslog(@"concretecolleague2 got message:%@", message);
}
@end
main方法調(diào)用
#import <foundation/foundation.h>
#import "concretemediator.h"
#import "concretecolleague1.h"
#import "concretecolleague2.h"
int main(int argc,const char * argv[])
{
@autoreleasepool{
concretemediator *m = [[concretemediator alloc]init];
concretecolleague1 *c1 = [[concretecolleague1 alloc]myinit:m];
concretecolleague2 *c2 = [[concretecolleague2 alloc]myinit:m];
[m setcolleague1:c1];
[m setcolleague2:c2];
[c1 send:@"good morning"];
[c2 send:@"good afternoon"];
}
return 0;
}
完工!