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

何为中介者模式?

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

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

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

何时使用中介者模式?

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

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

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

中介者模式的应用实例:

要是飞行员都争抢着起飞或降落机场而没有交通管制,会出现不可估量的危险。为了避免这种情况,飞行员就需要知道彼此的意图与位置。下面就如何知道彼此的位置来阐述中介者模式的应用。如下图所示,表示它们之间的关系。

抽象的AbstractRadarMediator定义了用于同Plane交互的一般行为。ConcreteRadarMediator为Plane定义了更加具体的行为,因此可以子类化AbstractRadarMediator,把各种Plane交互算法应用到相同或不同的Plane类型。如果应用程序只需要一个中介者,有时抽象的Mediator可以省略。

Plane的实例有一个Mediator实例的引用,同时AbstractRadarMediator的实例知道参与的每个对象。Plane的代码如下:

#import <Foundation/Foundation.h>

@class AbstractRadarMediator;
// import "AbstractRadarMediator.h",不能这样写,否则会出现相互导入,导致错误提示,头文件找不到
@interface Plane : NSObject

@property (nonatomic, assign) float distance; //距离机场的距离
@property (nonatomic, assign) float otherPlaneDistance; //其他飞机的位置

@property (nonatomic, strong) AbstractRadarMediator *radarMediator; //保持雷达中介者的引用

- (void)noticeLocation;

@end
#import "Plane.h"

@implementation Plane

- (void)noticeLocation {
    NSLog(@"通知其他飞机自己的位置");
}

@end

Plane类中的noticeLocation方法的具体由其子类来进行扩充,通过这种方式可以定义多种行为。PlaneA与PlaneB的代码如下:

#import "Plane.h"

@interface PlaneA : Plane

- (void)noticeLocation; //重写该方法

@end
#import "PlaneA.h"
#import "AbstractRadarMediator.h"
@implementation PlaneA

- (void)noticeLocation {
    [self.radarMediator noticeLocationToPlaneBWithDistance:self.distance];
}

@end
#import "Plane.h"

@interface PlaneB : Plane

- (void)noticeLocation; // 重写该方法

@end
#import "PlaneB.h"
#import "AbstractRadarMediator.h"
@implementation PlaneB

- (void)noticeLocation {
    [self.radarMediator noticeLocationToPlaneAWithDistance:self.distance];
}

@end

在这里我们可以看到noticeLocation的实现,通过中介者的方式向另外一个对象传递消息,这样做的好处就是使各对象不需要显式地相互引用,从而使其松耦合,而且可以独立地改变它们之间的交互。在AbstractRadarMediator定义同Plane对象交互的一般行为,代码如下:

#import <Foundation/Foundation.h>
#import "Plane.h"
@interface AbstractRadarMediator : NSObject

@property (nonatomic, strong) Plane *planeA;
@property (nonatomic, strong) Plane *planeB;

- (instancetype)initWithPlaneA:(Plane *)planeA planeB:(Plane *)planeB;

- (void)noticeLocationToPlaneAWithDistance:(float)distance;
- (void)noticeLocationToPlaneBWithDistance:(float)distance;

@end
#import "AbstractRadarMediator.h"

@implementation AbstractRadarMediator

- (instancetype)initWithPlaneA:(Plane *)planeA planeB:(Plane *)planeB {
    self = [super init];
    if (self) {
        _planeA = planeA;
        _planeB = planeB;
    }
    return self;
}

- (void)noticeLocationToPlaneAWithDistance:(float)distance {
    NSLog(@"由子类来实现");
}

- (void)noticeLocationToPlaneBWithDistance:(float)distance {
    NSLog(@"由子类来实现");
}

@end

在这里定义了noticeLocationToPlaneAWithDistance:(float)distance与noticeLocationToPlaneBWithDistance两种交互方式,但具体怎么交互,则由其相应的子类来完成,这样就更加灵活,方便为Plane对象提供各种交互算法。ConcreteRadarMediator类中的代码如下:

#import "AbstractRadarMediator.h"

@interface ConcreteRadarMediator : AbstractRadarMediator

// 重写这两个方法
- (void)noticeLocationToPlaneAWithDistance:(float)distance;
- (void)noticeLocationToPlaneBWithDistance:(float)distance;

@end
#import "ConcreteRadarMediator.h"

@implementation ConcreteRadarMediator

- (void)noticeLocationToPlaneAWithDistance:(float)distance {
    self.planeA.otherPlaneDistance = distance;
}

- (void)noticeLocationToPlaneBWithDistance:(float)distance {
    self.planeB.otherPlaneDistance = distance;
}

@end

到现在为止,上面已经介绍完中介者模式了,下面我们看下在客户端怎么使用中介者模式以及中介者模式带给我们的便利性,代码如下:

#import "ViewController.h"
#import "Plane.h"
#import "PlaneA.h"
#import "PlaneB.h"
#import "AbstractRadarMediator.h"
#import "ConcreteRadarMediator.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Plane *planeA = [[PlaneA alloc] init];
    PlaneB *planeB = [[PlaneB alloc] init];
    AbstractRadarMediator *radarMediator = [[ConcreteRadarMediator alloc] initWithPlaneA:planeA planeB:planeB];
    planeA.radarMediator = radarMediator; //保持AbstractRadarMediator的引用
    planeB.radarMediator = radarMediator;
    
    planeA.distance = 800.0f;
    planeB.distance = 1000.0f;
    
    [planeA noticeLocation];
    NSLog(@"飞机B收到A的位置通知:%f", planeB.otherPlaneDistance);
    
    [planeB noticeLocation];
    NSLog(@"飞机A收到B的位置通知:%f", planeA.otherPlaneDistance);
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

输出端的内如如下:

2015-09-01 09:44:42.236 MediatorPatter[12407:407240] 飞机B收到A的位置通知:800.000000
2015-09-01 09:44:42.237 MediatorPatter[12407:407240] 飞机A收到B的位置通知:1000.000000

在这里我们就可以看到,planeA与planeB两个对象之间没有相互的引用,但却实现了两个对象之间的通信,这样就减少了两者之间的关联,从而使其耦合松散,这正是使用中介者模式的便利性。

Demo链接地址:https://github.com/guoshimeihua/MediatorPatter

时间: 2024-10-11 17:04:22

iOS设计模式——中介者模式的相关文章

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

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

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

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

[设计模式]中介者模式

1. 定义 用一个中介者对象来封装了一个系列对象的交互,中介者使得各个对象可以不需要显式的引用,而且可以独立改变对象之间的交互. 中介者模式思路很简单,中介者模式中通过引入一个中介者对象,让其他对象与中介者对象进行交互,而中介者对象知道如何和所有对象交互,这样对象之间的交互关系就没有了,从而实现对象之间解耦. 每个同事对象发生了变化,不需要知道这样会引起其他对象什么变化,只需要通知中介者,由中介者去与其他对象交互.这样的松耦合带来的好处是,同事对象之间的交互关系减少,而且有利于功能的修改和扩展.

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

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

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

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

[设计模式] 中介者模式 Mediator Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 我们都知道,面向对象设计鼓励将行为分布到各个对象中.但是,这种分布可能会导致对象间有许多连接.在最坏的情况下,每一个对象都知道其他所有对象,就造成了复杂的关联关系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性.大量的相互连接使得一个对象似乎不太

深入浅出设计模式——中介者模式(Mediator Pattern)

模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题:? 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理.? 对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱.? 系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统

PHP设计模式 - 中介者模式

中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改. 一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式.PHP中不是特别常用的设计模式. <?php abstract class Mediator { // 中介者角色 abstract public function send($message,$colleague); } abstract class Colleague { // 抽象对象 private

设计模式----中介者模式及简单总结(2018/10/30)

中介者模式 这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. 代码实现:   知识点回顾 设计模式的核心是: 高内聚 低耦合 代码编写多 但是方便维护 1. 单例模式: 懒汉和饿汉(直接就new 线程相对安全) 但是在unity不涉及多线程, 所以都行 一般人们写的懒汉多一点 1). 普通class 2). 里面一个私有的 静态属性 对象 3). 私有构造函数 4). 共有 静态 对象返回值类型的 方法(GetInstance/Ge