Cowboy Tech

iOS设计模式-中介者

中介模式

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

  1. MVC中的控制器viewController就相当于中介
  2. 为何要使用中介者:解决复杂的交互问题,对象之间有大量的交互逻辑,彼此互相关联

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]);
}