Objective-C设计模式——中介者Mediator(对象去耦)
中介者模式
中介者模式很好的诠释了迪米特法则,任意两个不相关的对象之间如果需要关联,那么需要通过第三个类来进行。中介者就是把一组对象进行封装,屏蔽了类之间的交互细节,使不同的类直接不需要持有对方引用也可以进行访问。
中介者Mediator会持有同事类(就是需要处理交互逻辑的对象)Colleague的引用,同时每个colleague也会持有Mediator一份引用。这样colleague如果有任何和别的类交互的请求就会发给Mediator,对改组对象进行了解耦合。其实我们平时经常写的视图控制器本身就是一个中介中,它来控制着不同对象之间的交互行为。
应用场景
对象间交互虽然定义明确然而非常复杂,导致一组对象彼此相互依赖而且难以理解;
因为对象引用了许多其他对象并与其通讯,导致对象难以复用;
想要定制一个分布在多个类中的逻辑或行为,又不想生成太多子类。
中介者的优缺点
优点
Mediator出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator,由于把对象如何写作进行了抽象,将中介者作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上,也就是站在一个更宏观的角度去看待系统。
缺点
由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。
Demo
Colleague
#import <Foundation/Foundation.h> @class Mediator;
@interface Colleague : NSObject @property (nonatomic, weak) Mediator* mediator; -(instancetype)initWithMediator:(Mediator *)mediator; -(void)notifyAnother;
-(void)notified:(NSString *)message; @end #import "Colleague.h"
#import "Mediator.h" @implementation Colleague -(instancetype)initWithMediator:(Mediator *)mediator
{
self = [super init];
if(self)
{
_mediator = mediator;
}
return self;
} -(void)notified:(NSString *)message
{
NSLog(@"%@",message);
} -(void)notifyAnother
{
[self.mediator notify:self];
} @end #import "Colleague.h" @interface ConcreteColleagueA : Colleague @end #import "ConcreteColleagueA.h" @implementation ConcreteColleagueA @end #import "Colleague.h" @interface ConcreteColleagueB : Colleague @end #import "ConcreteColleagueB.h" @implementation ConcreteColleagueB @end
在OC中为了避免引用循环,所以Colleague的Mediator对象修饰符用weak
Mediator
#import <Foundation/Foundation.h>
#import "ConcreteColleagueA.h"
#import "ConcreteColleagueB.h" @interface Mediator : NSObject @property (nonatomic ,strong) ConcreteColleagueA *colleagueA;
@property (nonatomic ,strong) ConcreteColleagueB *colleagueB; -(void)notify:(NSObject *)obj; @end #import "Mediator.h" @implementation Mediator -(id)init
{
self = [super init];
if(self)
{ }
return self;
} -(void)notify:(NSObject *)obj
{
if (obj == self.colleagueA)
{
[self.colleagueB notified:@"B notified"];
}
else
{
[self.colleagueA notified:@"A notified"];
}
} @end
客户端
Mediator *mediator = [[Mediator alloc] init]; ConcreteColleagueA *colleagueA = [[ConcreteColleagueA alloc] initWithMediator:mediator];
ConcreteColleagueB *colleagueB = [[ConcreteColleagueB alloc] initWithMediator:mediator]; mediator.colleagueA = colleagueA;
mediator.colleagueB = colleagueB; [colleagueA notifyAnother];
[colleagueB notifyAnother];
-- ::42.508 Mediator[:] B notified
-- ::42.509 Mediator[:] A notified
Objective-C设计模式——中介者Mediator(对象去耦)的更多相关文章
- 设计模式--中介(Mediator)模式
时隔很长一段时,现在又重温设计模式,上个星期学习<设计模式--代理(Proxy)模式>http://www.cnblogs.com/insus/p/4128814.html. 温故而知新, ...
- javascript设计模式--中介者模式(Mediator)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 24种设计模式--中介者模式【Mediator Pattern】
各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一 ...
- 设计模式16:Mediator 中介者模式(行为型模式)
Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的 ...
- JAVA 设计模式 中介者模式
用途 中介者模式 (Mediator) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式是一种行为型模式. 结 ...
- 7. 星际争霸之php设计模式--中介者模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- javascript设计模式——中介者模式
前面的话 程序由大大小小的单一对象组成,所有这些对象都按照某种关系和规则来通信.当程序的规模增大,对象会越来越多,它们之间的关系也越来越复杂,难免会形成网状的交叉引用.当改变或删除其中一个对象的时候, ...
- iOS设计模式 - 中介者
iOS设计模式 - 中介者 原理图 说明 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 注:中介者对象本身没有复用价值 ...
- 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考
http://www.cnblogs.com/insus/p/4142264.html 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考 首先普世的编程架 ...
随机推荐
- Ubuntu 16.04重启输入法
一般使用搜狗输入法,但是偶尔不太稳定会挂掉,但是可以通过以下脚本重启: pidof fcitx | xargs kill pidof sogou-qimpanel | xargs kill nohup ...
- Property 'sqlMapClient' is required
继承SqlMapClientDaoSupport类的类里面添加如下代码 @Resource(name = "sqlMapClient") private SqlMapClient ...
- ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新
ArcGIS Engine效率探究——要素的添加和删除.属性的读取和更新 来自:http://blog.csdn.net/freewaywalker/article/details/23703863 ...
- [转] ASPNET Core 中获取应用程序物理路径
如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径,如下所示: // Classi ...
- windows 7 文件加密设置
方法/步骤1 加密文件 1 右击需加密的文件,选择“属性”命令. 2 在属性对话框的“常规‘选项卡中单击”高级“按钮. 3 在弹出的对话框中选中”加密内容以便保护数据“复选框,单击”确定“按钮. 4 ...
- java创建线程的三种方式及其对照
Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类.并重写该类的run方法,该run方法的方法体就代表了线程要完毕的任务.因此把run()方法称为运行 ...
- C++入门学习——模板
为什么须要模板? 我们已经学过重载(Overloading),对重载函数而言,C++ 通过函数參数(參数个数.參数类型)的正确匹配来调用重载函数.比如.为求两个数的最大值,我们定义 max () 函数 ...
- Python数据导入
1.csv格式数据导入 import pandas as pd w=pd.read.csv("数据地址") w.describe() w.sort_values(by=" ...
- Cocos2d-x3.1下 Android,APK自己主动升级
项目要做Android的自己主动升级,对于我们之前做iOS的转Cocos开发做Android方面的功能..... 不正确说了.这里记录下我的实现过程. 原文地址:http://blog.csdn.ne ...
- [办公自动化]如何让excel图表标签中显示最新值数据
同事做了一张excel图表,希望最新的数据显示数据标签,其他都不显示.并且当单元格的数据新增加时,这个标签要能自动更新. 这里需要用到公式,获取到这个最新值.在b2输入公式=lookup(9e+307 ...