Objective C中介者模式

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

   下面先給出類結構圖,再做簡單解釋。


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

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

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

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

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

  • Mediator類接口

1
2
3
4
5
6
7
#import <Foundation/Foundation.h>
                       
@class Colleague;
@interface Mediator :NSObject
-(void)Send:(NSString*)message
           :(Colleague*)colleague;
@end
  • Mediator類實現

1
2
3
4
5
6
7
#import "Mediator.h"
                     
@implementation Mediator
-(void)Send:(NSString *)message :(Colleague *)colleague{
    return;
}
@end
  • Colleague類接口

1
2
3
4
5
6
7
8
#import <Foundation/Foundation.h>
                   
@class Mediator;
@interface Colleague :NSObject{
    Mediator *myMediator;
}
-(Colleague*)MyInit:(Mediator*)mediator;
@end
  • Colleague類實現

1
2
3
4
5
6
7
8
9
10
#import "Colleague.h"
                  
@implementation Colleague
-(Colleague*)MyInit:(Mediator *)mediator{
    if (self == [super init]) {
        myMediator = mediator;
    }
    return self;
}
@end
  • ConcreteMediator類接口

1
2
3
4
5
6
7
8
#import "Mediator.h"
                
@class ConcreteColleague1;
@class ConcreteColleague2;
@interface ConcreteMediator :Mediator
@property ConcreteColleague1*colleague1;
@property ConcreteColleague2*colleague2;
@end
  • ConcreteMediator類實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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類接口

1
2
3
4
5
6
7
8
#import "Colleague.h"
            
@class Mediator;
@interface ConcreteColleague1 :Colleague
-(ConcreteColleague1*)MyInit:(Mediator*)mediator;
-(void)Send:(NSString*)message;
-(void)Notify:(NSString*)message;
@end
  • ConcreteColleague1類實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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類接口

1
2
3
4
5
6
7
8
#import "Colleague.h"
        
@class Mediator;
@interface ConcreteColleague2 :Colleague
-(ConcreteColleague2*)MyInit:(Mediator*)mediator;
-(void)Send:(NSString*)message;
-(void)Notify:(NSString*)message;
@end
  • ConcreteColleague2類實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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方法調用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章