定义
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
解决问题
对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
使用场景
多个类相互耦合,形成了网状结构。
网状结构
解决办法
将上述网状结构分离为星型结构。
星型结构
优缺点
优点
1、降低了类的复杂度,将一对多转化成了一对一。
2、各个类之间的解耦。
3、符合迪米特原则。
缺点
中介者会庞大,变得复杂难以维护。
使用场景
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
场景模拟
群聊
中介者 UML 图
中介者 UML 图简单代码
#import "User.h"
@interface ChatRoom : NSObject
+(void)showMessage:(User*)user Message:(NSString*)message;
@end
#import "ChatRoom.h"
@implementation ChatRoom
+(void)showMessage:(User*)user Message:(NSString*)message{
NSLog(@"用户:%@ 发送消息:%@",user.name,message);
}
@end
#import <Foundation/Foundation.h>
@interface User : NSObject
@property (nonatomic,strong) NSString * name;
-(void)sendMessage:(NSString *)message;
@end
#import "User.h"
#import "ChatRoom.h"
@implementation User
-(void)sendMessage:(NSString *)message{
[ChatRoom showMessage:self Message:message];
}
@end
测试代码
User * userLI = [User new];
userLI.name = @"晓丽";
User * userMing = [User new];
userMing.name=@"小明";
[userLI sendMessage:@"小明好"];
[userMing sendMessage:@"晓丽好"];
测试结果
2018-04-11 09:49:33.564922+0800 行为型设计模式-中介者模式[62496:8507584] 用户:晓丽 发送消息:小明好
2018-04-11 09:49:33.565092+0800 行为型设计模式-中介者模式[62496:8507584] 用户:小明 发送消息:晓丽好
下一篇博客
行为型设计模式-备忘录模式
网友评论