中介模式(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; }
|