首页 > 学院 > 开发设计 > 正文

iOS设计模式之中介者模式

2019-11-14 18:34:39
字体:
来源:转载
供稿:网友

中介者模式

基本理解

  • 中介者模式又叫做调停者模式,其实就是中间人或者调停者的意思。
  • 尽管将一个系统分割成许多对象通常可以增加可复用性,但是对象之间的连接又降低了可复用性。
  • 如果两个类不必彼此直接通信,那么着两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的方法的话,可以用过第三者转发这个调用。而这个第三者就是中介者。
  • 概念:中介者模式(Mediator),用一个中介者对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可 以独立地改变他们之间的交互。
  • UINavigationViewController就是属于一个中介者。

中介者模式的优缺点

中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了多对多交互复杂的对象群时,不要急于使用中介者模式,而要先反思你在系统上设计是否合理。
优点就是集中控制,减少了对象之间的耦合度。缺点就是太过于集中。

应用场景

  • 对象间的交互虽定义明确然而非常复杂,导致一组对象彼此相互依赖而且难以理解。
  • 因为对象引用了许多其他对象并与其通信,导致对象难以复用。
  • 想要定制一个分布在多个类中的逻辑或者行为,又不想生成太多子类。

例子

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。

附:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表