中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了多对多交互复杂的对象群时,不要急于使用中介者模式,而要先反思你在系统上设计是否合理。优点就是集中控制,减少了对象之间的耦合度。缺点就是太过于集中。
CoordinatingViewController.h
// // CoordinatingViewController.h // CoordinateDemo // // Created by zhanggui on 15/8/6. // Copyright (c) 2015年 zhanggui. All rights reserved. // #import <UIKit/UIKit.h> typedef NS_ENUM(NSInteger,ButtonTag) { kButtontagOpenThree, kButtontagOpenThreeNext, kButtontagBackThree }; @interface CoordinatingViewController : UIViewController @property(nonatomic,strong)NSMutableArray *controllersArray; @property(nonatomic,strong)UIViewController *activeController; @property(nonatomic,strong)UIViewController *mainViewController; +(instancetype)shareInstance; - (void)requestViewChangeByObject:(id)sender; @end
CoordinationgViewController.m
// // CoordinatingViewController.m // CoordinateDemo // // Created by zhanggui on 15/8/6. // Copyright (c) 2015年 zhanggui. All rights reserved. // #import "CoordinatingViewController.h" #import "ThirdViewController.h" #import "Third2ViewController.h" @interface CoordinatingViewController () { // UIStoryboard *storyboard; } @end @implementation CoordinatingViewController +(instancetype)shareInstance { static CoordinatingViewController *coorVC; if (coorVC==nil) { coorVC = [[self alloc] init]; } return coorVC; } - (void)viewDidLoad { [super viewDidLoad]; // storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; // Do any additional setup after loading the view. } - (void)requestViewChangeByObject:(id)sender { UIStoryboard *storyboard =[UIStoryboard storyboardWithName:@"Main" bundle:nil]; if ([sender isKindOfClass:[UIButton class]]) { switch ([sender tag]) { case kButtontagOpenThree: { ThirdViewController *thirdVC = [storyboard instantiateViewControllerWithIdentifier:@"ThirdViewController"]; self.activeController = thirdVC; [self.controllersArray addObject:thirdVC]; // UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:thirdVC]; [self.mainViewController presentViewController:thirdVC animated:YES completion:nil]; } break; case kButtontagOpenThreeNext: { Third2ViewController *third2VC = [storyboard instantiateViewControllerWithIdentifier:@"Third2ViewController"]; [self.controllersArray addObject:third2VC]; UIViewController *cvc = [self.controllersArray objectAtIndex:1]; [cvc presentViewController:third2VC animated:YES completion:nil]; } break; case kButtontagBackThree: { UIViewController *cvc = [self.controllersArray objectAtIndex:2]; [cvc dismissViewControllerAnimated:YES completion:nil]; [self.controllersArray removeObjectAtIndex:2]; } break; default: { UIViewController *cvc = [self.controllersArray objectAtIndex:1]; [cvc dismissViewControllerAnimated:YES completion:nil]; [self.controllersArray removeObjectAtIndex:1]; } break; } } } @end
上面这个就是中介类。在ViewController.m
// // ViewController.m // CoordinateDemo // // Created by zhanggui on 15/8/6. // Copyright (c) 2015年 zhanggui. All rights reserved. // #import "ViewController.h" #import "CoordinatingViewController.h" @interface ViewController () { CoordinatingViewController *coorController; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; coorController = [CoordinatingViewController shareInstance]; coorController.controllersArray = [[NSMutableArray alloc] initWithObjects:self, nil]; _firstButton.tag = kButtontagOpenThree; coorController.activeController = self; coorController.mainViewController = self; // Do any additional setup after loading the view, typically from a nib. } - (IBAction)showAction:(id)sender { [coorController requestViewChangeByObject:_firstButton]; } @end
ThirdViewController.m
// // ThirdViewController.m // CoordinateDemo // // Created by zhanggui on 15/8/6. // Copyright (c) 2015年 zhanggui. All rights reserved. // #import "ThirdViewController.h" #import "CoordinatingViewController.h" @interface ThirdViewController () @end @implementation ThirdViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)forwardAction:(id)sender { if ([sender isKindOfClass:[UIButton class]]) { UIButton *btn = (UIButton *)sender; btn.tag = kButtontagOpenThreeNext; CoordinatingViewController *coor = [CoordinatingViewController shareInstance]; [coor requestViewChangeByObject:btn]; } } @end
Third2ViewController.m
// // Third2ViewController.m // CoordinateDemo // // Created by zhanggui on 15/8/6. // Copyright (c) 2015年 zhanggui. All rights reserved. // #import "Third2ViewController.h" #import "CoordinatingViewController.h" @interface Third2ViewController () @end @implementation Third2ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ - (IBAction)backAction:(id)sender { if ([sender isKindOfClass:[UIButton class]]) { UIButton *btn = (UIButton *)sender; btn.tag = kButtontagBackThree; CoordinatingViewController *coor = [CoordinatingViewController shareInstance]; [coor requestViewChangeByObject:btn]; } } - (IBAction)forwardAction:(id)sender { } @end
上面的这两个就是视图迁移的中介处理ThirdViewController和Third2ViewController。