国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

詳解iOS應用的設計模式開發中Mediator中介者模式的使用

2019-10-21 18:55:10
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了iOS應用的設計模式開發中Mediator中介者模式的使用,示例代碼為傳統的Objective-C語言,需要的朋友可以參考下
 

何為中介者模式?

    面向對象的設計鼓勵把行為分散到不同對象中,這種分散可能導致對象之間的相互關聯。在最糟糕的情況下,所有對象都彼此了解并相互操作。

    雖然把行為分散到不同對象增強了可復用性,但是增加的相互關聯又減少了獲得的益處。增加的關聯使得對象很難或不能在不依賴其他對象的情況下工作。應用程序的整體行為可能難以進行任何重大修改,因為行為分布于許多對象。于是結果可能是創建越來越多的子類,以支持應用程序中的任何新行為。

    中介者模式:用一個對象來封裝一系列對象的交互方式。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

何時使用中介者模式?

1.對象間的交互雖定義明確然而非常復雜,導致一組對象彼此依賴而且難以理解。

2.因為對象引用了許多其他對象并與其通訊,導致對象難以復用。

3.想要定制一個分布在多個類中的邏輯或行為,又不想生成太多的子類。

中介者模式的實現示例:
下面先給出類結構圖,再做簡單解釋。

iOS應用開發,設計模式,Mediator,中介者模式

中介者模式很容易在系統中引用,但是也比較容易誤用。所以當系統出現了“多對多”交互復雜的對象群時,不要急于使用中介者模式,而要先反思系統在設計上是不是合理。

下面我們來說一說,中介者模式的優缺點。中介者的優點首先是Mediator的出現減少了各個Colleague的耦合,使得可以獨立地改變和復用各個Colleague類和Mediator。其次,由于把對象如何協作進行了抽象,將中介作為一個獨立的概念并將其封裝在一個對象中,這樣關注的對象就從對象各自本身的行為轉移到它們之間的交互上來,也就是站在一個更宏觀的角度去看待系統。

相對來說,缺點也很明顯。由于ConcreteMediator控制了集中化,于是就把交互復雜性變為了中介者的復雜性,這就使得中介者會變得比任何一個ConcreteColleage都復雜。所以一旦ConcreteMediator崩潰,那么整個系統都會受到影響。

還是那句老話,世上沒有銀彈,合適的就是最好的!

下面給大家簡單展示一下具體實現。

注意:本文所有代碼均在ARC環境下編譯通過。

Mediator類接口

復制代碼代碼如下:

#import <Foundation/Foundation.h>

 

@class Colleague;
@interface Mediator :NSObject
-(void)Send:(NSString*)message
           :(Colleague*)colleague;
@end


Mediator類實現
復制代碼代碼如下:

#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類實現
復制代碼代碼如下:

#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類實現
復制代碼代碼如下:

#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類實現
復制代碼代碼如下:

#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類實現

#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方法調用
復制代碼代碼如下:

#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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东明县| 台北市| 昆明市| 青海省| 永善县| 万盛区| 武宣县| 凤阳县| 牙克石市| 札达县| 连云港市| 色达县| 大港区| 定安县| 北票市| 克东县| 永修县| 徐州市| 绥棱县| 建瓯市| 云梦县| 马尔康县| 西畴县| 江华| 沁源县| 大埔区| 察雅县| 香格里拉县| 民县| 溧水县| 白河县| 甘肃省| 茂名市| 砀山县| 聂拉木县| 门头沟区| 东光县| 和政县| 张掖市| 西和县| 怀宁县|