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

 更新时间:2016年03月30日 17:57:08   作者:Snow Liang  
这篇文章主要介绍了iOS应用的设计模式开发中Mediator中介者模式的使用,示例代码为传统的Objective-C语言,需要的朋友可以参考下

何为中介者模式?

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

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

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

何时使用中介者模式?

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

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

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

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

2016330175627742.jpg (500×365)

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

下面我们来说一说,中介者模式的优缺点。中介者的优点首先是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;
}


完工!   

相关文章

  • Dispatch Source Timer的使用及注意事项介绍

    Dispatch Source Timer的使用及注意事项介绍

    这篇文章主要给大家介绍了关于Dispatch Source Timer使用和一些注意事项的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习下吧。
    2017-09-09
  • iOS利用UIScrollView实现无限滚动效果

    iOS利用UIScrollView实现无限滚动效果

    这篇文章主要给大家介绍了iOS如何利用UIScrollView实现无限滚动的效果,首先需要说明的是,文本所讲的是一种"笨办法",但是好理解且容易实现,在图片不多的时候用它也无妨。感兴趣的朋友们下面跟着小编一起来学习学习吧。
    2016-12-12
  • IOS之UIWebView的使用(基本知识)

    IOS之UIWebView的使用(基本知识)

    在Android开发中有WebView作为混合模式开发的桥梁,当然在IOS中也同样有一个 UIWebView 组件来作为混合模式开发的桥梁,那么下面就对UIWebView的一些基本知识详解一下
    2016-02-02
  • iOS测试手机APP的方法汇总:真机运行,打ipa包,testFlighe,蒲公英

    iOS测试手机APP的方法汇总:真机运行,打ipa包,testFlighe,蒲公英

    这篇文章主要介绍了iOS通常测试手机APP的四种方法:真机运行,打ipa包,(testFlighe)邮件,蒲公英测试。需要的朋友可以参考下
    2022-12-12
  • iOS10 适配远程推送功能实现代码

    iOS10 适配远程推送功能实现代码

    这篇文章主要介绍了iOS10 适配远程推送功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • iOS实现启动引导页与指纹解锁的方法详解

    iOS实现启动引导页与指纹解锁的方法详解

    这篇文章主要给大家介绍了关于iOS实现启动引导页与指纹解锁的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-02-02
  • ios Plist文件配置方法

    ios Plist文件配置方法

    下面小编就为大家分享一篇ios Plist文件配置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 详解iOS应用中自定义UIBarButtonItem导航按钮的创建方法

    详解iOS应用中自定义UIBarButtonItem导航按钮的创建方法

    这篇文章主要介绍了iOS应用中自定义UIBarButtonItem导航按钮的创建方法,文中举了一个自定义图片的UIBarButtonItem实例,比较具有代表性,需要的朋友可以参考下
    2016-04-04
  • iOS获取某个日期后n个月的日期

    iOS获取某个日期后n个月的日期

    这篇文章主要介绍了iOS获取某个日期后n个月的日期的相关资料,需要的朋友可以参考下
    2017-08-08
  • IOS 开发之读取addressbook的实现实例

    IOS 开发之读取addressbook的实现实例

    这篇文章主要介绍了IOS 开发之读取addressbook的实现实例的相关资料,希望通过本文大家能够掌握这样的内容,需要的朋友可以参考下
    2017-09-09

最新评论