詳解iOS應(yīng)用的設(shè)計(jì)模式開發(fā)中Mediator中介者模式的使用
何為中介者模式?
面向?qū)ο蟮脑O(shè)計(jì)鼓勵(lì)把行為分散到不同對(duì)象中,這種分散可能導(dǎo)致對(duì)象之間的相互關(guān)聯(lián)。在最糟糕的情況下,所有對(duì)象都彼此了解并相互操作。
雖然把行為分散到不同對(duì)象增強(qiáng)了可復(fù)用性,但是增加的相互關(guān)聯(lián)又減少了獲得的益處。增加的關(guān)聯(lián)使得對(duì)象很難或不能在不依賴其他對(duì)象的情況下工作。應(yīng)用程序的整體行為可能難以進(jìn)行任何重大修改,因?yàn)樾袨榉植加谠S多對(duì)象。于是結(jié)果可能是創(chuàng)建越來(lái)越多的子類,以支持應(yīng)用程序中的任何新行為。
中介者模式:用一個(gè)對(duì)象來(lái)封裝一系列對(duì)象的交互方式。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。
何時(shí)使用中介者模式?
1.對(duì)象間的交互雖定義明確然而非常復(fù)雜,導(dǎo)致一組對(duì)象彼此依賴而且難以理解。
2.因?yàn)閷?duì)象引用了許多其他對(duì)象并與其通訊,導(dǎo)致對(duì)象難以復(fù)用。
3.想要定制一個(gè)分布在多個(gè)類中的邏輯或行為,又不想生成太多的子類。
中介者模式的實(shí)現(xiàn)示例:
下面先給出類結(jié)構(gòu)圖,再做簡(jiǎn)單解釋。
中介者模式很容易在系統(tǒng)中引用,但是也比較容易誤用。所以當(dāng)系統(tǒng)出現(xiàn)了“多對(duì)多”交互復(fù)雜的對(duì)象群時(shí),不要急于使用中介者模式,而要先反思系統(tǒng)在設(shè)計(jì)上是不是合理。
下面我們來(lái)說(shuō)一說(shuō),中介者模式的優(yōu)缺點(diǎn)。中介者的優(yōu)點(diǎn)首先是Mediator的出現(xiàn)減少了各個(gè)Colleague的耦合,使得可以獨(dú)立地改變和復(fù)用各個(gè)Colleague類和Mediator。其次,由于把對(duì)象如何協(xié)作進(jìn)行了抽象,將中介作為一個(gè)獨(dú)立的概念并將其封裝在一個(gè)對(duì)象中,這樣關(guān)注的對(duì)象就從對(duì)象各自本身的行為轉(zhuǎn)移到它們之間的交互上來(lái),也就是站在一個(gè)更宏觀的角度去看待系統(tǒng)。
相對(duì)來(lái)說(shuō),缺點(diǎn)也很明顯。由于ConcreteMediator控制了集中化,于是就把交互復(fù)雜性變?yōu)榱酥薪檎叩膹?fù)雜性,這就使得中介者會(huì)變得比任何一個(gè)ConcreteColleage都復(fù)雜。所以一旦ConcreteMediator崩潰,那么整個(gè)系統(tǒng)都會(huì)受到影響。
還是那句老話,世上沒有銀彈,合適的就是最好的!
下面給大家簡(jiǎn)單展示一下具體實(shí)現(xiàn)。
注意:本文所有代碼均在ARC環(huán)境下編譯通過(guò)。
Mediator類接口
#import <Foundation/Foundation.h>
@class Colleague;
@interface Mediator :NSObject
-(void)Send:(NSString*)message
:(Colleague*)colleague;
@end
Mediator類實(shí)現(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類實(shí)現(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類實(shí)現(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類實(shí)現(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類實(shí)現(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;
}
完工!
- iOS App開發(fā)中使用設(shè)計(jì)模式中的單例模式的實(shí)例解析
- iOS App設(shè)計(jì)模式開發(fā)中對(duì)迭代器模式的使用示例
- iOS App的設(shè)計(jì)模式開發(fā)中對(duì)State狀態(tài)模式的運(yùn)用
- 實(shí)例解析設(shè)計(jì)模式中的外觀模式在iOS App開發(fā)中的運(yùn)用
- 深入解析設(shè)計(jì)模式中的裝飾器模式在iOS應(yīng)用開發(fā)中的實(shí)現(xiàn)
- iOS應(yīng)用運(yùn)用設(shè)計(jì)模式中的Strategy策略模式的開發(fā)實(shí)例
- iOS App設(shè)計(jì)模式開發(fā)中策略模式的實(shí)現(xiàn)示例
- IOS開發(fā)中的設(shè)計(jì)模式匯總
相關(guān)文章
iOS中使用UItableviewcell實(shí)現(xiàn)團(tuán)購(gòu)和微博界面的示例
這篇文章主要介紹了iOS中使用UItableviewcell實(shí)現(xiàn)團(tuán)購(gòu)和微博界面的示例,開發(fā)語(yǔ)言基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-01-01iOS實(shí)現(xiàn)類似微信和支付寶的密碼輸入框(UIKeyInput協(xié)議)
這篇文章主要介紹了iOS實(shí)現(xiàn)類似微信和支付寶的密碼輸入框,通過(guò)UIKeyInput協(xié)議為響應(yīng)者提供簡(jiǎn)單的鍵盤輸入的功,再通過(guò)CoreGraphics繪制出密碼輸入框,感興趣的小伙伴們可以參考一下2016-08-08searchDisplayController 引起的數(shù)組越界處理辦法
這篇文章主要介紹了searchDisplayController 引起的數(shù)組越界處理辦法,需要的朋友可以參考下2015-07-07解析iOS應(yīng)用的UI開發(fā)中懶加載和xib的簡(jiǎn)單使用方法
這篇文章主要介紹了解析iOS應(yīng)用的UI開發(fā)中懶加載和xib的簡(jiǎn)單使用方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-01-01