文档章节

[架构]中介者模式

a
 advancer_chen
发布于 2016/05/18 11:30
字数 668
阅读 177
收藏 1

本人所有文章目录: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
粉丝 17
博文 19
码字总数 19578
作品 0
朝阳
iOS工程师
私信 提问
MVP那些事儿(5) 中介者模式与MVP的关系

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

不能用真名
2017/12/16
0
0
Java设计模式之-中介者模式(Mediator)

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

Mock2052
2017/11/28
0
0
大型 JavaScript 应用架构中的模式

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

文艺小青年
2017/06/29
0
0
Java进阶篇设计模式之十 ---- 访问者模式和中介者模式

前言 在上一篇中我们学习了结构型模式的解释器模式(Interpreter Pattern)和迭代器模式(Iterator Pattern)。本篇则来学习下行为型模式的两个模式,访问者模式(Visitor Pattern)和中介者模式...

Ala6
2018/11/05
0
0
设计模式的学习(13)中介者模式

中介者模式 中介者模式(Mediator Pattern)又称为调停者模式,是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,中介者通常处理不同对象之间的通信,使各对象不需要显式...

杨健-YJ
2018/12/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
7
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
7
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
8
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
昨天
6
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部