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)模式.的思考 首先普世的编程架 ...
随机推荐
- codevs——1019 集合论与图论
1019 集合论与图论 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 集合论与图论对于小松来说 ...
- 洛谷 U41572 Portal2
U41572 Portal2 题目背景 某地ENLIGHTENED的XM研究所正在研究Portal的处理法则,想要揭示XM能量的来源以及应用XM能量.ENLIGHTENED的首席科学家Jacks发现其 ...
- 根据身份证号,取得行政区划的Javascript实现
原文:http://www.cnblogs.com/baibaluo/archive/2011/06/03/2071255.html#2585076 项目里需要一个根据身份证号,取得发证地行政区划的的 ...
- 玩转iOS开发 - 消息推送
消息推送
- Setting up Storm and Running Your First Topology
http://www.haroldnguyen.com/blog/2015/01/setting-up-storm-and-running-your-first-topology/ --------- ...
- Spark修炼之道(基础篇)——Linux大数据开发基础:第二节:Linux文件系统、文件夹(一)
本节主要内容 怎样获取帮助文档 Linux文件系统简单介绍 文件夹操作 訪问权限 1. 怎样获取帮助文档 在实际工作过程其中,常常会忘记命令的使用方式.比如ls命令后面能够跟哪些參数,此时能够使用ma ...
- linux netlink套接字实现相似ss命令 ,统计套接字以及TCP信息
參考了 ss的源码 以及 netlink相关资料:http://blog.csdn.net/scdxmoe/article/details/27711205 实现结果为: gcc netlink_di ...
- mysql正则表达式及应用
mysql where子句的模式匹配 今天在应用中遇到了这样的一个问题,有一个字段 t1,其中的值类似于:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2 需要从里面搜索出比如说:第一个 ...
- 演练:我的第一个 WPF 桌面应用程序 https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/getting-started/walkthrough-my-first-wpf-desktop-application
这篇文章演示如何开发简单的 Windows Presentation Foundation (WPF) 应用程序包括元素所共有的大多数 WPF 应用程序: 可扩展应用程序标记语言 (XAML) 标记. ...
- jquery.validate自己定义验证--成功提示与择要提示
1. 自己定义验证--成功提示 1) 加入选项 errorClass: "unchecked". validClass: "checked", errorEle ...