设计模式-中介者模式

定义:
用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

角色:

  • 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用于层级之间的行为和数据传递,减少层级之间的互相了解。