文档章节

[架构]中介者模式

a
 advancer_chen
发布于 2016/05/18 11:30
字数 668
阅读 156
收藏 1
点赞 2
评论 0

本人所有文章目录:http://my.oschina.net/ChenTF/blog/677112

 

参考:

C#方式实现:  http://blog.csdn.net/fly_yr/article/details/8576130

OC实现(此实现方式存在循环引用问题): http://my.oschina.net/daguoshi/blog/499906

 

介绍


     用一个对象来封装一系列对象的交互方式。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

使用场景:

  •      对象间的交互虽定义明确然而非常复杂,导致一组对象彼此依赖而且难以理解
  •      因为对象引用了许多其他对象并与其通讯,导致对象难以复用。
  •      想要定制一个分布在多个类中的逻辑或行为,又不想生成太多的子

类图


 

实现


1.抽象中介者(Mediator)

#import <Foundation/Foundation.h>
@class Colleague;

/**
 *  抽象中介者
 */
@interface Mediator : NSObject

- (void)sendWithMess:(NSString *)message Colleague:(Colleague *)colleague;


@end

作用: 1.定义抽象方法

 

2.具体中介者(ConcreteMediator)

#import "Mediator.h"

#import "ConcreteColleague1.h"
#import "ConcreteColleague2.h"

/**
 *  具体中介者类
 */
@interface ConcreteMediator : Mediator

@property (nonatomic, strong) ConcreteColleague1 * colleague1;
@property (nonatomic, strong) ConcreteColleague2 * colleague2;

@end
#import "ConcreteMediator.h"

@implementation ConcreteMediator

- (void)sendWithMess:(NSString *)message Colleague:(Colleague *)colleague {
    
    if (colleague == self.colleague1) {
        
        [self.colleague2 notifyWithMess:message];
    }
    
    if (colleague == self.colleague2) {
        
        [self.colleague1 notifyWithMess:message];
    }
}

#pragma mark - Getters & Setters
- (ConcreteColleague1 *)colleague1 {
    if (_colleague1 == nil) {
        _colleague1 = [[ConcreteColleague1 alloc] initWithMediator:self];
    }
    return _colleague1;
}

- (ConcreteColleague2 *)colleague2 {
    if (_colleague2 == nil) {
        _colleague2 = [[ConcreteColleague2 alloc] initWithMediator:self];
    }
    return _colleague2;
}

@end

作用:

  1. 持有具体事件类  
  2. 实现具体事件处理逻辑

 

3.抽象同事类

#import <Foundation/Foundation.h>

#import "Mediator.h"

/**
 *  同事类的协议
 */
@protocol Colleague <NSObject>

@required
- (void)notifyWithMess:(NSString *)mess;

- (void)sendWithMess:(NSString *)mess;
@end

/**
 *  抽象同事类
 */
@interface Colleague : NSObject<Colleague>

@property (nonatomic, assign) Mediator *mediator;

- (instancetype)initWithMediator:(Mediator *)mediator;

@end
#import "Colleague.h"

@implementation Colleague

- (instancetype)initWithMediator:(Mediator *)mediator {
    self = [super init];
    if (self) {
        self.mediator = mediator;
    }
    
    return self;
}


#pragma mark - Colleague
- (void)notifyWithMess:(NSString *)mess {
    
}

- (void)sendWithMess:(NSString *)mess {
    
    [self.mediator sendWithMess:mess Colleague:self];
}

@end

作用:

  1. 声明收到消息 抽象方法  
  2. 实现发送消息方法与构造方法

注意:

  • 为了防止循环引用, mediator是weak修饰

 

4.具体同事类

#import "Colleague.h"

/**
 *  具体同事类
 */
@interface ConcreteColleague1 : Colleague

@end


#import "ConcreteColleague1.h"

@implementation ConcreteColleague1

- (void)notifyWithMess:(NSString *)mess {
    
    NSLog(@"同事1 收到消息:%@", mess);
}

- (void)dealloc {
    
}

@end

作用: 1.实现收到消息的处理

 

5.调用

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    self.mediator = [[ConcreteMediator alloc] init];
    
    [self.mediator.colleague1 sendWithMess:@"1的消息, 吃了吗?"];
    [self.mediator.colleague2 sendWithMess:@"2的消息, 还没,要请客吗?"];
}

结果:

 

Code:


https://github.com/ChenTF/MediatorPatterDemo

 

更好的实现方式


    本文是使用的传统版中介者模式, 但是在iOS下可以运用运行 来更优雅的实现, 推荐Casa大神的这篇文章(http://casatwy.com/iOS-Modulization.html), 再次感谢Casa大神给我带来的很多帮助与启发。

© 著作权归作者所有

共有 人打赏支持
a
粉丝 16
博文 17
码字总数 17262
作品 0
朝阳
高级程序员
MVP那些事儿(5) 中介者模式与MVP的关系

目录 MVP那些事儿(1)……用场景说话 MVP那些事儿(2)……MVC架构初探 MVP那些事儿(3)……在Android中使用MVC(上) MVP那些事儿(4)……在Android中使用MVC(下) MVP那些事儿(5)……中介者模式...

不能用真名
2017/12/16
0
0
大型 JavaScript 应用架构中的模式

原文:Patterns For Large-Scale JavaScript Application Architecture by @Addy Osmani 今天我们要讨论大型 JavaScript 应用架构中的有效模式。这篇文章基于我最近在 LondonJS 的同名演讲,...

文艺小青年
2017/06/29
0
0
Java设计模式之-中介者模式(Mediator)

中介者模式,又叫调停者模式。我看的书里面是叫做调停者的,我个人认为没有“中介者”这个名字容易理解。 中介者模式:在一个庞大系统中,多个类之间需要进行信息的交换,从而引发后续的行为...

Mock2052
2017/11/28
0
0
23种设计模式(7):中介者模式

定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。 类型:行为类模式 类图: 中介者模式的结构 中介者...

LCZ777
2014/07/06
0
0
行为型模式:Mediator 中介者模式

行为型模式:Mediator 中介者模式 1、依赖关系的转化 1)多个对象之间的相互依赖是非常复杂的,这些对像都是两两直接依赖,而用实现细节依赖于抽象的做法对于这种情况已经不够用了,因为这...

flyhighly
2011/04/24
0
0
基于蚂蚁金服「如何管理好10万行代码」搭建了 Vue 项目架构

原文:如何管理好10万行代码的前端单页面应用。 当时看到蚂蚁金服这篇文章有点茅塞顿开,只不过他们是基于 React 技术栈开发的,但是架构是一种思想,不区分语言不区分框架的,所以我相信这套...

深圳人人聚财前端团队
05/29
0
0
我的Java设计模式-中介者模式

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 小时候钟爱战争片,《地道战》、《鸡毛信》、《铁道游击队》一系列的老电影,咦~想起都激动得起鸡皮疙瘩。不过觉得特别逗的是,电影...

Jet啟思
01/17
0
0
【白话设计模式十三】中介者模式(Mediator)

白话设计模式 工厂模式 单例模式 【白话设计模式一】简单工厂模式(Simple Factory) 【白话设计模式二】外观模式(Facade) 【白话设计模式三】适配器模式(Adapter) 【白话设计模式四】单例模式...

陶邦仁
2016/03/31
196
0
行为型模式之十:中介者模式

中介者模式是用来协调一组同事,这些同事可能互相不直接交流,而是中介者。 在下面的例子中,Colleague A 想聊天,Colleague B 想打架。当他们做一些动作,他们唤醒中介者去做。 中介者类图 ...

刀狂剑痴
2015/08/27
12
0
三分钟教会你JS设计模式之中介者模式

中介者模式的作用就是解除对象与对象之间的紧耦合关系。增加一个中介者对象后,所以的相关对象都通过中介者对象来通信,而不是互相引用,所以当一个对象发生改变时,只需要通知中介者对象即可...

littl_Prince
2016/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android 复制和粘贴功能

做了一回搬运工,原文地址:https://blog.csdn.net/kennethyo/article/details/76602765 Android 复制和粘贴功能,需要调用系统服务ClipboardManager来实现。 ClipboardManager mClipboardM...

她叫我小渝
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
6
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0
There is no session with id[xxx]

参考网页 https://blog.csdn.net/caimengyuan/article/details/52526765 报错 2018-07-19 23:04:35,330 [http-nio-1008-exec-8] DEBUG [org.apache.shiro.web.servlet.SimpleCookie] - Found......

karma123
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部