• iOS设计模式之中介者模式


    中介者模式

    基本理解

    • 中介者模式又叫做调停者模式,其实就是中间人或者调停者的意思。
    • 尽管将一个系统分割成许多对象通常可以增加可复用性,但是对象之间的连接又降低了可复用性。
    • 如果两个类不必彼此直接通信,那么着两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的方法的话,可以用过第三者转发这个调用。而这个第三者就是中介者。
    • 概念:中介者模式(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。

    附:

  • 相关阅读:
    ORM和JDBC
    四种会话跟踪技术以及jstl介绍
    GC、进程和线程的定义
    数组和链表的理解,及各自的优缺点
    JSP和Servlet及浏览器与tomcat交互过程
    多线程、同步实现方法及Error和Exception的区别与联系
    Eclipse创建一个普通maven项目详细步骤
    Eclipse创建一个动态maven项目详细步骤
    Myeclipse项目出现红叉解决方案
    数据结构和算法 — 平衡二叉树的实现
  • 原文地址:https://www.cnblogs.com/zhanggui/p/4707745.html
Copyright © 2020-2023  润新知