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];
2015-07-26 16:48:42.508 Mediator[3888:1799182] B notified
2015-07-26 16:48:42.509 Mediator[3888:1799182] A notified
时间: 2024-11-09 06:42:49

Objective-C设计模式——中介者Mediator(对象去耦)的相关文章

设计模式(中介者模式-对象去耦)

声明:本系列文章内容摘自<iOS设计模式> 中介者模式 用一个对象来封装一系列对象的交互方式.中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 何时使用中介者模式 1.对象间的交互虽定义明确然而非常复杂,导致椅子对象彼此相互依赖而且难以理解: 2.因为对象引用了许多其他对象并与其通信,导致对象难以复用: 3.想要制定一个分布在多个对象中的逻辑或行为,又不想生成太多子类. 举个例子 有三个视图,我们可能需要两两之间进行跳转,类比于公司内同时每两个人都有可能

对象去耦的方法之二:中介者模式

中介者模式定义了一个对象,该对象封装了一组对象是如何交互的.这种模式被认为是一个行为模式,因为它可以改变程序的运行行为.它解决了类与类之间趋于复杂的依赖关系.当功能种出现了多对多的复杂对象群时就可以使用中介者模式.将一定的复杂度移到了Mediator中,所以Mediator类的功能维护需要谨慎处理. 中介者模式一个重要的应用就是,通过设置路由器来管理VC之间的跳转关系. 如何实现: 思想:实现一个管理VC的功能类,这个类的作用是给每个VC绑定一个URL.当需要打开某个新的VC时,可以通过功能类的

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

各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一个软件公司,要开发软件,需要开发环境吧, Windows 操作系统,数据库产品等,这你得买吧,那就是采购,开发完毕一个产品还要把产品推销出去,推销出去了大家才有钱赚,不推销出去大家都去喝西北风呀,既然有产品就必然有库存,软件产品也有库存,你总要拷贝吧,虽然是不需要占用库房空间,那也是要占用光盘或硬盘

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

Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的更改,这种直接的引用将面临不断的变化. 在这种情况下,我们可以使用一个“中介对象”来管理对象间的关联关系,避免相互的对象之间的紧耦合引用关系,从而更好地抵御变化. 意图(Intent) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们

大话设计模式—中介者模式

中介者模式(Mediator Pattern)是用来减少多个对象和类之间的通信复杂性. 这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合.使代码易于维护. 中介者模式属于行为型模式. 引言: 虽然一个系统切割成很多对象通常能够添加其可复用性.可是对象间相互连接次数的添加又会减少其可复用性:大量的连接使得一个对象不可能在没有其它对象的支持下工作.系统表现为一个不可切割的总体,所以,对系统的行为进行不论什么较大的修改就十分困难了. 要解决这种问题.我们能够使用 迪米特原则 ,假设

【C#设计模式-中介者模式】

一.概述:中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系.中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为. 二.例子:QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用. 三.结构: 者模式设计两个具体对象,一个是用户类,另一个是中介者类,根据针对接口编程原则,则需要把这两类角色进行抽象,所以中介者模式中就有了4类角色,它们分别是:抽象中介者角色,具体中介者角色.抽象同事类和具体同事类.中介者类是起到协调各

PHP设计模式——中介者模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 中介者模式用一个中介者对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互. UML类图: 角色: 中介者接口(UnitedNations):在里面定义了各个同事之间相互交互所需要的方法. 具体的中介者实现对象(UnitedCommit):它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系. 同事类的定义(Country):通常实现成为抽象类,主要负责约束同

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

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248183.html============================================

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

前面的话 程序由大大小小的单一对象组成,所有这些对象都按照某种关系和规则来通信.当程序的规模增大,对象会越来越多,它们之间的关系也越来越复杂,难免会形成网状的交叉引用.当改变或删除其中一个对象的时候,很可能需要通知所有引用到它的对象.面向对象设计鼓励将行为分布到各个对象中,把对象划分成更小的粒度,有助于增强对象的可复用性,但由于这些细粒度对象之间的联系激增,又有可能会反过来降低它们的可复用性.中介者模式的作用就是解除对象与对象之间的紧耦合关系.增加一个中介者对象后,所有的相关对象都通过中介者对象