中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了多对多交互复杂的对象群时,不要急于使用中介者模式,而要先反思你在系统上设计是否合理。
优点就是集中控制,减少了对象之间的耦合度。缺点就是太过于集中。
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;@endCoordinationgViewController.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];}@endThirdViewController.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]; }}@endThird2ViewController.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。
新闻热点
疑难解答