详解iOS应用的设计模式开发中Mediator中介者模式的使用

何为中介者模式?

面向对象的设计鼓励把行为分散到不同对象中,这种分散可能导致对象之间的相互关联。在最糟糕的情况下,所有对象都彼此了解并相互操作。

虽然把行为分散到不同对象增强了可复用性,但是增加的相互关联又减少了获得的益处。增加的关联使得对象很难或不能在不依赖其他对象的情况下工作。应用程序的整体行为可能难以进行任何重大修改,因为行为分布于许多对象。于是结果可能是创建越来越多的子类,以支持应用程序中的任何新行为。

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

何时使用中介者模式?

1.对象间的交互虽定义明确然而非常复杂,导致一组对象彼此依赖而且难以理解。

2.因为对象引用了许多其他对象并与其通讯,导致对象难以复用。

3.想要定制一个分布在多个类中的逻辑或行为,又不想生成太多的子类。

中介者模式的实现示例:
下面先给出类结构图,再做简单解释。

中介者模式很容易在系统中引用,但是也比较容易误用。所以当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思系统在设计上是不是合理。

下面我们来说一说,中介者模式的优缺点。中介者的优点首先是Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator。其次,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

相对来说,缺点也很明显。由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleage都复杂。所以一旦ConcreteMediator崩溃,那么整个系统都会受到影响。

还是那句老话,世上没有银弹,合适的就是最好的!

下面给大家简单展示一下具体实现。

注意:本文所有代码均在ARC环境下编译通过。

Mediator类接口

代码如下:

#import <Foundation/Foundation.h>

@class Colleague;
@interface Mediator :NSObject
-(void)Send:(NSString*)message
           :(Colleague*)colleague;
@end

Mediator类实现

代码如下:

#import "Mediator.h"

@implementation Mediator
-(void)Send:(NSString *)message :(Colleague *)colleague{
    return;
}
@end

Colleague类接口

代码如下:

#import <Foundation/Foundation.h>

@class Mediator;
@interface Colleague :NSObject{
    Mediator *myMediator;
}
-(Colleague*)MyInit:(Mediator*)mediator;
@end

Colleague类实现

代码如下:

#import "Colleague.h"

@implementation Colleague
-(Colleague*)MyInit:(Mediator *)mediator{
    if (self == [super init]) {
        myMediator = mediator;
    }
    return self;
}
@end

ConcreteMediator类接口

代码如下:

#import "Mediator.h"

@class ConcreteColleague1;
@class ConcreteColleague2;
@interface ConcreteMediator :Mediator
@property ConcreteColleague1*colleague1;
@property ConcreteColleague2*colleague2;
@end

ConcreteMediator类实现

代码如下:

#import "ConcreteMediator.h"
#import "ConcreteColleague1.h"
#import "ConcreteColleague2.h"
#import "Colleague.h"

@implementation ConcreteMediator
@synthesize colleague1;
@synthesize colleague2;

-(void)Send:(NSString *)message :(Colleague *)colleague{
    if ([colleague isKindOfClass:[ConcreteColleague1 class]]) {
        [colleague2 Notify:message];
    }
    else {
        [colleague1 Notify:message];
    }
}
@end

ConcreteColleague1类接口

代码如下:

#import "Colleague.h"

@class Mediator;
@interface ConcreteColleague1 :Colleague
-(ConcreteColleague1*)MyInit:(Mediator*)mediator;
-(void)Send:(NSString*)message;
-(void)Notify:(NSString*)message;
@end

ConcreteColleague1类实现

代码如下:

#import "ConcreteColleague1.h"
#import "Mediator.h"

@implementation ConcreteColleague1
-(ConcreteColleague1*)MyInit:(Mediator*)mediator{
    if (self == [super init]) {
        myMediator = mediator;
    }
    return self;
}
-(void)Send:(NSString *)message{
    [myMediator Send:message :self];
}
-(void)Notify:(NSString *)message{
    NSLog(@"ConcreteColleague1 got message:%@", message);
}
@end

ConcreteColleague2类接口

代码如下:

#import "Colleague.h"

@class Mediator;
@interface ConcreteColleague2 :Colleague
-(ConcreteColleague2*)MyInit:(Mediator*)mediator;
-(void)Send:(NSString*)message;
-(void)Notify:(NSString*)message;
@end
ConcreteColleague2类实现

#import "ConcreteColleague2.h"
#import "Mediator.h"

@implementation ConcreteColleague2
-(ConcreteColleague2*)MyInit:(Mediator*)mediator{
    if (self == [super init]) {
        myMediator = mediator;
    }
    return self;
}
-(void)Send:(NSString *)message{
    [myMediator Send:message :self];
}
-(void)Notify:(NSString *)message{
    NSLog(@"ConcreteColleague2 got message:%@", message);
}
@end

Main方法调用

代码如下:

#import <Foundation/Foundation.h>
#import "ConcreteMediator.h"
#import "ConcreteColleague1.h"
#import "ConcreteColleague2.h"

int main(int argc,const char * argv[])
{
    @autoreleasepool{
        ConcreteMediator *m = [[ConcreteMediator alloc]init];
        ConcreteColleague1 *c1 = [[ConcreteColleague1 alloc]MyInit:m];
        ConcreteColleague2 *c2 = [[ConcreteColleague2 alloc]MyInit:m];
        [m setColleague1:c1];
        [m setColleague2:c2];
        [c1 Send:@"Good morning"];
        [c2 Send:@"Good afternoon"];
    }
    return 0;
}

完工!

(0)

相关推荐

  • iOS App开发中使用设计模式中的单例模式的实例解析

    一.单例的作用 顾名思义,单例,即是在整个项目中,这个类的对象只能被初始化一次.它的这种特性,可以广泛应用于某些需要全局共享的资源中,比如管理类,引擎类,也可以通过单例来实现传值.UIApplication.NSUserDefaults等都是IOS中的系统单例. 二.单例模式的两种写法 1,常用写法 #import "LGManagerCenter.h" static LGManagerCenter *managerCenter; @implementation LGManagerCe

  • iOS App设计模式开发中策略模式的实现示例

    这次介绍一下策略模式(Strategy Pattern),相比之下是一种比较简单的模式.它也叫政策模式(Policy Pattern). 策略模式使用的就是面向对象的继承和多态机制,其他的没有什么玄机.策略模式适合使用在: 1. 多个类只有在算法或行为上稍有不同的场景. 2. 算法需要自由切换的场景. 3. 需要屏蔽算法规则的场景. 使用策略模式当然也有需要注意的地方,那么就是策略类不要太多,如果一个策略家族的具体策略数量超过4个,则需要考虑混合模式,解决策略类膨胀和对外暴露问题.在实际项目中,

  • iOS App设计模式开发中对迭代器模式的使用示例

    何为迭代器模式? 迭代器提供了一种顺序访问集合对象中元素的方法,而无需暴漏结构的底层表示和细节.遍历集合中元素的职能从集合本身转移到迭代器对象.迭代器定义了一个用于访问集合元素并记录当前元素的接口.不同的迭代器可以执行不同的策略. 例子 说了这么多,下面给大家展示一下类关系图. 上图中Client的右边是迭代器,左边是具体迭代的类型,在迭代器内部对具体需要迭代的类型进行了引用,还算不难理解吧,呵呵.其实,看起来是为了对具体类型进行解耦.好啦,下面给出具体的代码实现,简单的模拟了迭代器模式. 注意

  • IOS开发中的设计模式汇总

    iOS开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷原则:开放-封闭原则 实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求. 列表row个数delegate 自定义的delegate (二)观察者模式 应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布

  • 实例解析设计模式中的外观模式在iOS App开发中的运用

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义 一个高层接口,这个接口使得这一子系统更加容易使用. 下面给大家展示一下类的结构图,想必大家一看就明白了: 其实这个模式中,没有类与类之间的继承关系,只是进行了简单的类引用,统一了对外的接口而已.看起来是不是很简单?废话不多说了,下面简单向大家展示一下代码吧! 注意:本文所有代码均在ARC环境下编译通过. SubSystemOne类接口 复制代码 代码如下: #import <Foundation/Foundation.

  • 深入解析设计模式中的装饰器模式在iOS应用开发中的实现

    装饰器模式可以在不修改代码的情况下灵活的为一对象添加行为和职责.当你要修改一个被其它类包含的类的行为时,它可以代替子类化方法. 一.基本实现 下面我把类的结构图向大家展示如下: 让我们简单分析一下上面的结构图,Component是定义一个对象接口,可以给这些对象动态地添加职责.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需

  • iOS应用运用设计模式中的Strategy策略模式的开发实例

    在写程序的时候,我们经常会碰到这样的场景:把一堆算法塞到同一段代码中,然后使用if-else或switch-case条件语句来决定要使用哪个算法?这些算法可能是一堆相似的类函数或方法,用以解决相关的问题.比如,一个验证输入数据的例程,数据本身可以是任何数据类型(如NSString.CGFloat等),每种数据类型需要不同的验证算法.如果能把每个算法封装成一个对象,那么就能消除根据数据类型决定使用什么算法的一堆if-else或switch-case语句. 我们把相关算法分离为不同的类,称为策略模式

  • iOS App的设计模式开发中对State状态模式的运用

    1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得"力不从心了".随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,

  • 详解iOS应用的设计模式开发中Mediator中介者模式的使用

    何为中介者模式? 面向对象的设计鼓励把行为分散到不同对象中,这种分散可能导致对象之间的相互关联.在最糟糕的情况下,所有对象都彼此了解并相互操作. 虽然把行为分散到不同对象增强了可复用性,但是增加的相互关联又减少了获得的益处.增加的关联使得对象很难或不能在不依赖其他对象的情况下工作.应用程序的整体行为可能难以进行任何重大修改,因为行为分布于许多对象.于是结果可能是创建越来越多的子类,以支持应用程序中的任何新行为. 中介者模式:用一个对象来封装一系列对象的交互方式.中介者使各对象不需要显式地相互引用

  • 实例讲解iOS应用的设计模式开发中的Visitor访问者模式

    为了方便向大家展示,先给出简短的定义: 访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 紧接着,给出其类结构图. 访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作结合可以相对自由地演化. 访问者模式的目的是要把处理从数据结构分离出来.很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,

  • 详解如何在C#/.NET Core中使用责任链模式

    最近我有一个朋友在研究经典的"Gang Of Four"设计模式.他经常来询问我在实际业务应用中使用了哪些设计模式.单例模式.工厂模式.中介者模式 - 都是我之前使用过,甚至写过相关文章的模式.但是有一种模式是我还没有写过文章,即责任链模式. 什么是责任链?# 责任链模式(之前我经常称之为命令链模式)是一种允许以使用分层方式"处理"对象的模式.在维基百科中的经典定义是 在面向对象设计中,责任链模式是一种由命令对象源及其一系列处理对象组成的设计模式.每个处理对象包含了

  • 详解iOS App设计模式开发中对于享元模式的运用

    享元模式的概念 在面向对象软件设计中,利用公共对象不仅能节省资源还能提高性能.共享的对象只能提供某些内在的信息,而不能用来识别对象.专门用于设计可共享对象的一种设计模式叫做享元模式(Flyweight pattern). 实现享元模式需要两个关键组件,通常是可共享的享元对象和保存他们的池.某种中央对象维护这个池,并从它返回适当的实例. 运用共享技术有效地支持大量细粒度的对象. 公共交通(如公共汽车)已有一百多年的历史了.大量去往相同方向的乘客可以分担保有和经营车辆(如公共汽车)的费用.公共汽车有

  • iOS App设计模式开发中对interpreter解释器模式的运用

    解释器模式 今天和大家分享的模式是解释器模式. 首先介绍一下解释器模式适合解决哪类问题. 其实,解释器模式需要解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子.这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题. 就应用的例子来说,例如正则表达式就是它的一种具体应用,解释器可以为正则表示定义一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式. 解释器模式的类结构图如下. 图中的结构也比较好理解,解释器方法抽

  • 详解Java设计模式编程中的中介者模式

    定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 类型:行为类模式 类图: 中介者模式的结构        中介者模式又称为调停者模式,从类图中看,共分为3部分:  抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信.一般包括一个或几个抽象的事件方法,并由子类去实现. 中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法.从一个同事类接收消息,然后通过消息影响其他同时类. 同事类

  • 详解iOS的Core Animation框架中的CATransform3D图形变换

    一.矩阵坐标 CATransform3D定义了一个变化矩阵,通过对矩阵参数的设置,我们可以改变layer的一些属性,这个属性的改变,可以产生动画的效果. CATransform3D CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz) tx:X轴偏移位置,往下为正数. ty:Y轴偏移位置,往右为正数. tz:Z轴偏移位置,往外为正数. 例: 如果有2个图层,一个是绿色的,一个是红色的.先加载绿色,后加载红色. tx,t

  • 详解IOS开发中生成推送的pem文件

    详解IOS开发中生成推送的pem文件 具体步骤如下: 首先,需要一个pem的证书,该证书需要与开发时签名用的一致. 具体生成pem证书方法如下: 1. 登录到 iPhone Developer Connection Portal(http://developer.apple.com/iphone/manage/overview/index.action )并点击 App IDs 2. 创建一个不使用通配符的 App ID .通配符 ID 不能用于推送通知服务.例如,  com.itotem.ip

  • 详解IOS中文件路径判断是文件还是文件夹

    详解IOS中文件路径判断是文件还是文件夹 方法1 + (BOOL)isDirectory:(NSString *)filePath { BOOL isDirectory = NO; [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory]; return isDirectory; } 方法2 + (BOOL)isDirectory:(NSString *)filePath { NSNum

随机推荐