最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解iOS應(yīng)用的設(shè)計(jì)模式開(kāi)發(fā)中Mediator中介者模式的使用

 更新時(shí)間:2016年03月30日 17:57:08   作者:Snow Liang  
這篇文章主要介紹了iOS應(yīng)用的設(shè)計(jì)模式開(kāi)發(fā)中Mediator中介者模式的使用,示例代碼為傳統(tǒng)的Objective-C語(yǔ)言,需要的朋友可以參考下

何為中介者模式?

    面向?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)單解釋。

2016330175627742.jpg (500×365)

中介者模式很容易在系統(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ì)受到影響。

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

下面給大家簡(jiǎn)單展示一下具體實(shí)現(xiàn)。

注意:本文所有代碼均在ARC環(huán)境下編譯通過(guò)。

Mediator類接口

復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>

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


Mediator類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "Mediator.h"

@implementation Mediator
-(void)Send:(NSString *)message :(Colleague *)colleague{
    return;
}
@end


Colleague類接口
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>

@class Mediator;
@interface Colleague :NSObject{
    Mediator *myMediator;
}
-(Colleague*)MyInit:(Mediator*)mediator;
@end


Colleague類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "Colleague.h"

@implementation Colleague
-(Colleague*)MyInit:(Mediator *)mediator{
    if (self == [super init]) {
        myMediator = mediator;
    }
    return self;
}
@end


ConcreteMediator類接口
復(fù)制代碼 代碼如下:

#import "Mediator.h"

@class ConcreteColleague1;
@class ConcreteColleague2;
@interface ConcreteMediator :Mediator
@property ConcreteColleague1*colleague1;
@property ConcreteColleague2*colleague2;
@end


ConcreteMediator類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#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類接口
復(fù)制代碼 代碼如下:

#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)
復(fù)制代碼 代碼如下:

#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類接口
復(fù)制代碼 代碼如下:

#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)用
復(fù)制代碼 代碼如下:

#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;
}


完工!   

相關(guān)文章

  • iOS頁(yè)面跳轉(zhuǎn)及數(shù)據(jù)傳遞(三種)

    iOS頁(yè)面跳轉(zhuǎn)及數(shù)據(jù)傳遞(三種)

    本文主要介紹了iOS頁(yè)面跳轉(zhuǎn)的三種方法及數(shù)據(jù)傳遞的方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 清除WKWebView cookies的方法

    清除WKWebView cookies的方法

    下面小編就為大家?guī)?lái)一篇清除WKWebView cookies的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • xcode 4 制作靜態(tài)庫(kù)圖文詳解

    xcode 4 制作靜態(tài)庫(kù)圖文詳解

    我這個(gè)文檔的靜態(tài)庫(kù)的開(kāi)發(fā)是基于Xcode4.2和iOS SDK5.0編寫的。Xcode4跟之前的Xcode3還是有不少的差別的
    2013-06-06
  • 仿iOS圖標(biāo)抖動(dòng)

    仿iOS圖標(biāo)抖動(dòng)

    最近閑來(lái)無(wú)聊,研究了一下IPhone桌面圖標(biāo)的抖動(dòng),網(wǎng)上有一個(gè)類似的事例,但是我看來(lái)效果實(shí)在不佳,自己也來(lái)寫一個(gè)玩玩,有需要的小伙伴可以參考下。
    2015-05-05
  • Xcode中iOS應(yīng)用開(kāi)發(fā)的一般項(xiàng)目目錄結(jié)構(gòu)和流程簡(jiǎn)介

    Xcode中iOS應(yīng)用開(kāi)發(fā)的一般項(xiàng)目目錄結(jié)構(gòu)和流程簡(jiǎn)介

    這篇文章主要介紹了Xcode中iOS應(yīng)用開(kāi)發(fā)的一般項(xiàng)目目錄結(jié)構(gòu)和流程簡(jiǎn)介,包括項(xiàng)目所需的一些平臺(tái)路徑如模擬器路徑等的介紹,需要的朋友可以參考下
    2016-02-02
  • iOS tableview實(shí)現(xiàn)頂部拉伸效果

    iOS tableview實(shí)現(xiàn)頂部拉伸效果

    這篇文章主要為大家詳細(xì)介紹了iOS tableview實(shí)現(xiàn)頂部拉伸效果,以及頭部拉伸效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 淺析iOS中視頻播放的幾種方案

    淺析iOS中視頻播放的幾種方案

    還記得剛學(xué)iOS的時(shí)候嗎?那個(gè)時(shí)候驚訝于各種牛逼的功能只需要幾句簡(jiǎn)單的代碼就可以完成。視頻播放也是這樣,IOS中視頻播放有好幾種方式,這篇文章就給大家整理這幾種方案優(yōu)缺點(diǎn)與實(shí)現(xiàn)過(guò)程。
    2016-08-08
  • h5 ios輸入框和鍵盤的兼容性優(yōu)化指南

    h5 ios輸入框和鍵盤的兼容性優(yōu)化指南

    這篇文章主要給大家介紹了關(guān)于h5 ios輸入框和鍵盤的兼容性優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • iOS11上Xcode9 AppIcon 圖標(biāo)不顯示

    iOS11上Xcode9 AppIcon 圖標(biāo)不顯示

    升級(jí)到iOS11系統(tǒng)下自己的項(xiàng)目桌面app圖標(biāo)不見(jiàn)了,是什么原因呢,經(jīng)過(guò)一番查找,終于發(fā)現(xiàn)問(wèn)題所在,現(xiàn)在分享給大家
    2017-11-11
  • iOS+PHP注冊(cè)登錄系統(tǒng) iOS部分(下)

    iOS+PHP注冊(cè)登錄系統(tǒng) iOS部分(下)

    這篇文章主要介紹了iOS+PHP注冊(cè)登錄系統(tǒng)的iOS部分,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評(píng)論

衡阳市| 贵溪市| 巴楚县| 怀宁县| 和田县| 屏东县| 龙岩市| 麻城市| 昌乐县| 义马市| 芦溪县| 盘山县| 托克托县| 法库县| 丰县| 壶关县| 阿瓦提县| 富源县| 蓝山县| 全南县| 武功县| 沐川县| 通化市| 镇原县| 江陵县| 牙克石市| 彩票| 赤水市| 颍上县| 略阳县| 雷州市| 黎城县| 句容市| 西平县| 客服| 永兴县| 祁连县| 东乡县| 务川| 厦门市| 南投市|