定义:
用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
角色:
- Mediator
- ConcrateMediator
- Member
- ConcrateMember
类图:
实例:
新增一个聊天室成员只需要新建一个成员实例,然后再在聊天室中介者那注册就可以加入聊天室了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| @interface ChatMediator : NSObject
+ (instancetype)shared;
- (void)registerChatMember:(ChatMember *)chatMember;
- (void)forwardMessage:(NSString *)message fromMember:(ChatMember *)fromMember;
@end
@interface ChatMediator ()
@property (nonatomic, strong) NSMutableArray *memberList;
@end
@implementation
+ (instancetype)shared { static id instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [ChatMediator new]; }); return instance; }
- (instancetype)init { self = [super init]; if (self) { _memberList = [NSMutableArray new]; } return self; }
- (void)registerChatMember:(ChatMember *)chatMember { [_chatMember addObject:chatMember]; }
- (void)forwardMessage:(NSString *)message fromMember:(ChatMember *)fromMember { [_memberList enumerateObjectUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){ if(obj != fromMember) { [member receiveMessage:message fromMember:member]; } }] } @end
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @interface ChatMember : NSObject
@property (nonatomic, strong) NSString *userName;
- (void)sendMessage:(NSString *)message; - (void)receiveMessage:(NSString *)message fromMember:(ChatMember *)fromMember;
@end
@implementation ChatMember
- (void)sendMessage:(NSString *)message { [[ChatMediator shared] forwardMessage:message fromMember:self]; } - (void)receiveMessage:(NSString *)message fromMember:(ChatMember *)fromMember { NSLog(@"%@-----%@------%@",_userName,message,fromMember.userName); }
@end
|
我们可以这样使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| ChatMediator *mediator = [ChatMediator shared]; ChatMember *a = [ChatMember new]; ChatMember *b = [ChatMember new]; ChatMember *c = [ChatMember new];
[mediator registerMember:a]; [mediator registerMember:b]; [mediator registerMember:c];
a.userName = @"a"; b.userName = @"b"; c.userName = @"c";
[a sendMessage:@"aaaaaaaaaaaaaaa"]; [b sendMessage:@"bbbbbbbbbbbbbbb"]; [c sendMessage:@"ccccccccccccccc"];
|
优点:
- 中介者模式简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星型结构。
- 中介者模式可将各同事对象解耦。中介者有利于各同事之间的松耦合,我们可以独立的改变和复用每一个同事和中介者,增加新的中介者和新的同事类都比较方便,更好地符合“开闭原则”。
- 以减少子类生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使各个同事类可被重用,无须对同事类进行扩展。
缺点:
- 在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
实操:
- 在层级结构比较复杂的GUI中,我们可以构建一个Mediator用于层级之间的行为和数据传递,减少层级之间的互相了解。