中介者模式

中介者模式很好的诠释了迪米特法则,任意两个不相关的对象之间如果需要关联,那么需要通过第三个类来进行。中介者就是把一组对象进行封装,屏蔽了类之间的交互细节,使不同的类直接不需要持有对方引用也可以进行访问。

中介者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(对象去耦)的更多相关文章

  1. 设计模式--中介(Mediator)模式

    时隔很长一段时,现在又重温设计模式,上个星期学习<设计模式--代理(Proxy)模式>http://www.cnblogs.com/insus/p/4128814.html. 温故而知新, ...

  2. javascript设计模式--中介者模式(Mediator)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 24种设计模式--中介者模式【Mediator Pattern】

    各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一 ...

  4. 设计模式16:Mediator 中介者模式(行为型模式)

    Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的 ...

  5. JAVA 设计模式 中介者模式

    用途 中介者模式 (Mediator) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式是一种行为型模式. 结 ...

  6. 7. 星际争霸之php设计模式--中介者模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  7. javascript设计模式——中介者模式

    前面的话 程序由大大小小的单一对象组成,所有这些对象都按照某种关系和规则来通信.当程序的规模增大,对象会越来越多,它们之间的关系也越来越复杂,难免会形成网状的交叉引用.当改变或删除其中一个对象的时候, ...

  8. iOS设计模式 - 中介者

    iOS设计模式 - 中介者 原理图 说明 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 注:中介者对象本身没有复用价值 ...

  9. 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考

    http://www.cnblogs.com/insus/p/4142264.html 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考 首先普世的编程架 ...

随机推荐

  1. 二级域名相同的情况下子页面调用父页面的js方法

    这两天项目遇到这种需求.项目是一个平台级系统,其中嵌入了多款应用.在平台上可以使用这些应用操作业务. 现在产品提出了个需求:即在A应用中需要调用js方法来打开B应用. 处理方法是:平台js中给出个打开 ...

  2. Linux下使用make install安装的软件如何卸载

    如果是Ubuntu的系统,那么可以使用checkinstall来生成deb包来安装,然后卸载 参考:http://blog.sina.com.cn/s/blog_4178f4bf0101cmt7.ht ...

  3. spring依赖注入中获取JavaBean

    一.这个接口有什么用? 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以 ...

  4. ovs ml2

    用openvswitch + ml2 构建vlan类型的tenant/project 网络 配置ml2 和 openvswitch_agent 配置 /etc/neutron/plugins/ml2/ ...

  5. 【CV论文阅读】Detecting events and key actors in multi-person videos

    论文主要介绍一种多人协作的视频事件识别的方法,使用attention模型+RNN网络,最近粗浅地学习了RNN网络,它比较适合用于处理序列的存在上下文作用的数据. NCAA Basketball数据集 ...

  6. react 组件之间的通信

    react推崇的是单向数据流,自上而下进行数据的传递,但是由下而上或者不在一条数据流上的组件之间的通信就会变的复杂.解决通信问题的方法很多,如果只是父子级关系,父级可以将一个回调函数当作属性传递给子级 ...

  7. react 项目实战(三)表单验证

    我们需要记录每一个字段当前的有效状态,有效时隐藏错误信息,无效时显示错误信息. 而这个有效/无效,可以在表单值改变的时候进行判断. 我们对/src/pages/UserAdd.js进行修改: 首先修改 ...

  8. HttpURL连接远程serverGet和Post方式请求并返回数据

    查看原文:http://www.ibloger.net/article/1813.html package cn.gis; import java.io.BufferedReader; import ...

  9. react 开发过程中的总结/归纳

    1.点击元素,获取绑定该事件的父级元素,使用 e.currentTarget.e.target 获取的是,出发该事件的元素,该元素有可能是所绑定事件的元素的子元素. 2.使用 react router ...

  10. 将mvvmlight 移植到 ios step1

    https://github.com/wangrenzhu/SimpleIoc-For-Objective-c simple ios for objective-c 版 基本实现 全部功能  完美实现 ...