中介模式
- 中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 中介者模式解决的问题:解耦 / 降低复杂度,从混乱的网状结构变成线状 / 增加程序可维护性
| 情形1: | 情形2: | 情形3: |
|---|---|---|
| B:9500 | B:8000 | B:11000 |
| D:9000 | D:8000 | D:11000 |



AbstractMediator
@interface AbstractMediator : NSObject <ColleagueDelegate>
@end
@implementation AbstractMediator
- (void)colleagueEvent:(AbstractColleague *)event {
}
@end
AbstractColleague
@class AbstractColleague;
@protocol ColleagueDelegate <NSObject>
@optional
//colleague对象的交互
- (void)colleagueEvent:(AbstractColleague *)event;
@end
@interface AbstractColleague : NSObject
@property (nonatomic, weak) id <ColleagueDelegate> delegate;
@end
@implementation AbstractColleague
@end
MVC与中介者
- MVC中的控制器viewController就相当于中介
- 为何要使用中介者:解决复杂的交互问题,对象之间有大量的交互逻辑,彼此互相关联


Colleague
@interface Colleague : AbstractColleague
@property (nonatomic) CGFloat value;
- (void)changeValue:(CGFloat)value;
@end
@implementation Colleague
- (void)changeValue:(CGFloat)value {
self.value = value;
if (self.delegate && [self.delegate respondsToSelector:@selector(colleagueEvent:)]) {
[self.delegate colleagueEvent:self];
}
}
@end
TypeOneMediator
@interface TypeOneMediator : AbstractMediator
@property (nonatomic, strong) Colleague *colleagueA;
@property (nonatomic, strong) Colleague *colleagueB;
@property (nonatomic, strong) Colleague *colleagueC;
- (NSDictionary *)values;
@end
@implementation TypeOneMediator
- (void)colleagueEvent:(AbstractColleague *)event {
if ([event isEqual:self.colleagueA]) {
self.colleagueB.value = self.colleagueA.value * 2;
self.colleagueC.value = self.colleagueA.value * 4;
} else if ([event isEqual:self.colleagueB]) {
self.colleagueA.value = self.colleagueB.value / 2.f;
self.colleagueC.value = self.colleagueB.value * 2.f;
} else {
self.colleagueA.value = self.colleagueC.value / 4.f;
self.colleagueB.value = self.colleagueC.value / 2.f;
}
}
- (NSDictionary *)values {
return @{@"A" : @(self.colleagueA.value),
@"B" : @(self.colleagueB.value),
@"C" : @(self.colleagueC.value)};
}
@end
ViewController
@interface ViewController ()
@property (nonatomic, strong) TypeTwoMediator *mediator;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.mediator = [TypeTwoMediator new];
Colleague *colleagueA = [Colleague new];
Colleague *colleagueB = [Colleague new];
Colleague *colleagueC = [Colleague new];
self.mediator.colleagueA = colleagueA;
self.mediator.colleagueB = colleagueB;
self.mediator.colleagueC = colleagueC;
colleagueA.delegate = self.mediator;
colleagueB.delegate = self.mediator;
colleagueC.delegate = self.mediator;
[colleagueA changeValue:2.f];
NSLog(@"%@", [self.mediator values]);
[colleagueA changeValue:1.f];
NSLog(@"%@", [self.mediator values]);
[colleagueA changeValue:3.f];
NSLog(@"%@", [self.mediator values]);
}