服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - 详解iOS应用的设计模式开发中Mediator中介者模式的使用

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

2021-01-13 16:30Snow Liang IOS

这篇文章主要介绍了iOS应用的设计模式开发中Mediator中介者模式的使用,示例代码为传统的Objective-C语言,需要的朋友可以参考下

何为中介者模式?

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

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

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

何时使用中介者模式?

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

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

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

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

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

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

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


完工!

延伸 · 阅读

精彩推荐
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01