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。
附:
iOS设计模式之中介者模式的更多相关文章
- IOS设计模式之三:MVC模式
IOS设计模式之三:MVC模式 模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 折腾Java设计模式之中介者模式
博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...
- iOS设计模式 - (3)简单工厂模式
iOS设计模式 - (3)简单工厂模式 by Colin丶 转载请注明出处: http://blog.csdn.net/hitwhylz/article/ ...
- js设计模式——8.中介者模式
js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...
- IOS设计模式之一(MVC模式,单例模式)
iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...
- 【GOF23设计模式】中介者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 package com.test.mediator; /** * 同事类的接口 */ ...
- [设计模式] 17 中介者模式 Mediator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...
- 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)
中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...
随机推荐
- 【目录】C#操作Excel组件Spire.XLS系列文章目录
本博客所有文章分类的总目录链接:http://www.cnblogs.com/asxinyu/p/4288836.html 1.C#操作Excel组件Spire.XLS文章目录 1.[原创].NET读 ...
- publishing failed with multiple errors
背景: 1.使用maven package工程 2. 在eclipse中添加server运行时 publishing failed with multiple errors resource is o ...
- 30个实用的 Photoshop 动作《免费下载》
这篇文章向设计师们分享30个实用的 Photoshop 动作下载.Photoshop 的动作是用集合了许多步的操作的集合,使执行任务自动化,这为设计者在进行图像处理的操作上带来很多方便.同时用户还可以 ...
- PEP8 Python 编码规范
一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车.3 类 ...
- 如何将oc代码转换成运行时代码
// 运行时 其实就是oc的底层 平时写的代码 最终都是转成底层的运行时代码以下面程序为例子: 如果我们想要看我们的main.m文件底层转换成了怎样的运行时代码 ,我们可以这样做. 1.打开终端 ...
- linux中$与()的一点使用疑惑解释
a=$(cat 1.sh)等价于a=`cat 1.sh` 而a=(cat 1.sh) 相当于定义一个a数组,内容为cat 1.sha=(`cat 1.sh`)相当于把1.sh里面的内容当成a的数组,a ...
- Spring重点—— IOC 容器中 Bean 的生命周期
一.理解 Bean 的生命周期,对学习 Spring 的整个运行流程有极大的帮助. 二.在 IOC 容器中,Bean 的生命周期由 Spring IOC 容器进行管理. 三.在没有添加后置处理器的情况 ...
- ADO.NET基础01
数据库中数据的导入导出 在使用一些数据库时,很多时候都要将文件导入导出到指定的文件夹中: 数据的导入导出就必须用到stream函数,这就必须用到Using System.IO的命名空间: **在数 ...
- Codeforces Round #313 (Div. 1) B. Equivalent Strings
Equivalent Strings Problem's Link: http://codeforces.com/contest/559/problem/B Mean: 给定两个等长串s1,s2,判断 ...
- mis导入器的加强版——vdproj文件资源浏览器
上次做的那个导入器不够强大,限制还不小,用起来不方便.于是就再做一个这样的工具.代码基本上不同了,思想还是差不多,但功能肯定比之前的强大.经过了这次编写工具,对vdporj文件的了解又深一层了. 在v ...