中介者模式(Mediator Pattern)
2022-09-16 本文已影响0人
long弟弟
中介者模式,调停模式
意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
在中介者模式中,类之间的交互行为统一放在中介者的对象中,对象通过中介者对象同其他对象交互,中介对象起着控制器的作用。
中介者模式.jpg
角色和职责
- Mediator 抽象中介者
中介者类的抽象父类,定义一个接口用于各同事(Colleague)对象通信 - ConcreteMediator
具体的中介者类,通过协调各同事对象实现协作行为
了解并维护它的各个同事 - Colleague
同事类的抽象父类 - ConcreteColleague
具体的同事类,每个同事类都知道它的中介者对象
每一个同事对象在需要与其他同事通信的时候,与它的中介者通信
代码示例
未使用中介者模式
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int sex;
@property (nonatomic, assign) int condition;
@end
@implementation Person
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition {
return nil;
}
- (void)findPartner:(Person *)person {}
@end
@interface Man : Person
@end
@implementation Man
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition {
if (self = [super init]) {
self.name = name;
self.sex = sex;
self.condition = condition;
}
return self;
}
//找对象
- (void)findPartner:(Person *)person {
if (person.sex == self.sex) {
NSLog(@"不找同性恋");
}else if (person.condition == self.condition) {
NSLog(@"%@和%@ 般配", self.name, person.name);
}else {
NSLog(@"%@和%@ 不般配", self.name, person.name);
}
}
@end
@interface Woman : Person
@end
@implementation Woman
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition {
if (self = [super init]) {
self.name = name;
self.sex = sex;
self.condition = condition;
}
return self;
}
- (void)findPartner:(Person *)person {
if (person.sex == self.sex) {
NSLog(@"不找同性恋");
}else if (person.condition == self.condition) {
NSLog(@"%@和%@ 般配", self.name, person.name);
}else {
NSLog(@"%@和%@ 不般配", self.name, person.name);
}
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *xiaohong = [[Woman alloc] initWithName:@"小红" AndSex:0 AndCondition:5];
Person *zs = [[Man alloc] initWithName:@"张三" AndSex:1 AndCondition:4];
Person *ls = [[Man alloc] initWithName:@"李四" AndSex:1 AndCondition:5];
//小红自己找对象,对张三李四的关系太密切了
[xiaohong findPartner:zs];
[xiaohong findPartner:ls];
}
return 0;
}
/*
小红和张三 不般配
小红和李四 般配
*/
使用中介者模式
#import <Foundation/Foundation.h>
@class Mediator;
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int sex;
@property (nonatomic, assign) int condition;
@property (nonatomic, strong) Mediator *mediator;
@end
@implementation Person
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition AndMediator:(Mediator *)mediator {
return nil;
}
- (void)findPartner:(Person *)person {
}
@end
@interface Mediator : NSObject
@property (nonatomic, strong) Person *pMan;
@property (nonatomic, strong) Person *pWoman;
@end
@implementation Mediator
- (void)findPartner {
if (self.pWoman.sex == self.pMan.sex) {
NSLog(@"不找同性恋");
}else if (self.pWoman.condition == self.pMan.condition) {
NSLog(@"%@和%@ 般配", self.pWoman.name, self.pMan.name);
}else {
NSLog(@"%@和%@ 不般配", self.pWoman.name, self.pMan.name);
}
}
@end
@interface Man : Person
@end
@implementation Man
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition AndMediator:(Mediator *)mediator {
if (self = [super init]) {
self.name = name;
self.sex = sex;
self.condition = condition;
self.mediator = mediator;
}
return self;
}
- (void)findPartner:(Person *)person {
self.mediator.pMan = self;
self.mediator.pWoman = person;
[self.mediator findPartner];
}
@end
@interface Woman : Person
@end
@implementation Woman
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition AndMediator:(Mediator *)mediator {
if (self = [super init]) {
self.name = name;
self.sex = sex;
self.condition = condition;
self.mediator = mediator;
}
return self;
}
- (void)findPartner:(Person *)person {
self.mediator.pMan = person;
self.mediator.pWoman = self;
[self.mediator findPartner];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Mediator *mediator = [[Mediator alloc] init];
Person *xh = [[Woman alloc] initWithName:@"小红" AndSex:0 AndCondition:5 AndMediator:mediator];
Person *zs = [[Man alloc] initWithName:@"张三" AndSex:1 AndCondition:4 AndMediator:mediator];
Person *ls = [[Man alloc] initWithName:@"李四" AndSex:1 AndCondition:5 AndMediator:mediator];
[xh findPartner:zs];//实际是由中介匹配zs的性别、条件等
[xh findPartner:ls];
}
return 0;
}
/*
小红和张三 不般配
小红和李四 般配
*/
用处
用一个中介对象,封装一系列对象(同事)的交换,中介者是各个对象不需要显示的相互作用,从而实现了耦合松散,而且可以独立的改变他们之间的交换。
应用场景:飞机塔台、婚姻介绍所、房屋中介...
多个对象相互耦合形成网状结构,利用中介者模式将网状结构分离为星型结构。
优点
- 简化对象之间的交互,将各参与者进行解耦
对于复杂的对象之间的交互,引入中介者,可以简化各类的设计和实现 - 符合迪米特法则
缺点
具体中介者中包含了参与者之间的交互细节,可能会使中介者类本身非常复杂
题外话
- 忽略抽象的Mediator类
如使用中介者模式的代码示例中,各Colleague仅与一个Mediator一起工作,没必要定义一个抽象的Mediator类。 -
代码示例中,中介者模式持有了Man和Woman两个指针,也可以进行扩展,持有N个对象的集合...