在对象去耦合的模式中,有两种模式:中介者模式,观察者模式

一,概念

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

  这个模式我们可以简单的类比于星型结构,中介者就是中心,其他对象的交互都是通过中心的中介者作为媒介,而不是直接交互,这样就避免了对象直接交互导致的关系混乱,不易维护的缺点。

二,类图

  

  Mediator为抽象的中介者,它定义了与抽象Colleague交互的一般行为,ConcreteMediator为ConcreteColleague定义了更加具体的行为,通过子类化中介者(Mediator),把各种Colleague交互行为应用到相同或者不同的colleague类型。Colleague的实例有一个中介者(Mediator)实例的引用,同时中介者的实例知道参与这个组织的每个对象。每一个ConcreteColleague只知道自己的交互行为,不知道其他的ConcreteColleague的行为,但是它们都知道ConcreteMediator对象。如果应用中只需要一个中介者,有时可以省去抽象的Mediator。

三,代码演示

Mediator

protocol MediatorProtocol {
func showImage(data: Data)
func memberNum(data: Data)
func storageData(data: Data)
func arithmetic(data: Data)
}

ConcreteMediator

class MainBoard: MediatorProtocol {

    var cpu: ColleagueProtocol?
var memory: ColleagueProtocol?
var disk: ColleagueProtocol?
var graphics: ColleagueProtocol? func showImage(data: Data) {
graphics?.operation(data: Data())
} func memberNum(data: Data) {
memory?.operation(data: Data())
} func storageData(data: Data) {
disk?.operation(data: Data())
} func arithmetic(data: Data) {
cpu?.operation(data: Data())
} }

Colleague

protocol ColleagueProtocol {

    var mediator: MediatorProtocol{get}
init(mediator: MediatorProtocol) func operation(data: Data) }

ColleagueConcrete

class CPU: ColleagueProtocol {
var mediator: MediatorProtocol required init(mediator: MediatorProtocol) {
self.mediator = mediator
} func operation(data: Data) {
print("cpu operation data \(data)")
} func showImage() {
mediator.showImage(data: Data())
} }
class Memory: ColleagueProtocol {
var mediator: MediatorProtocol required init(mediator: MediatorProtocol) {
self.mediator = mediator
} func operation(data: Data) {
print("Memory member data \(data)")
} func storageData() {
mediator.storageData(data: Data())
} }
class Disk: ColleagueProtocol {
var mediator: MediatorProtocol required init(mediator: MediatorProtocol) {
self.mediator = mediator
} func operation(data: Data) {
print("Disk storage data \(data)")
} }
class Graphics: ColleagueProtocol {
var mediator: MediatorProtocol required init(mediator: MediatorProtocol) {
self.mediator = mediator
} func operation(data: Data) {
print("Graphics show data \(data)")
} }

Client

class ViewController: UIViewController {

    override func viewDidLoad() {
super.viewDidLoad() let mainboard = MainBoard()
let cpu = CPU(mediator: mainboard)
mainboard.cpu = cpu
let memeory = Memory(mediator: mainboard)
mainboard.memory = memeory
mainboard.disk = Disk(mediator: mainboard)
mainboard.graphics = Graphics(mediator: mainboard) cpu.showImage()
memeory.storageData()
}
}

设计模式-(9)中介者模式(swift)的更多相关文章

  1. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  2. 折腾Java设计模式之中介者模式

    博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...

  3. js设计模式——8.中介者模式

    js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...

  4. 【GOF23设计模式】中介者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 package com.test.mediator; /** * 同事类的接口 */ ...

  5. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

  6. 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)

    中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...

  7. 设计模式之中介者模式(Mediator )

    中介者模式是关于数据交互的设计模式,该模式的核心是一个中介者对象,负责协调一系列对象之间的不同的数据请求,这一系列对象成为同事类.如房产中介(简直不想提它),买房的卖房的,租房的放租的都到房产中介那里 ...

  8. PHP设计模式系列 - 中介者模式

    中介者模式 中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改.一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式. ...

  9. 深入理解JavaScript系列(36):设计模式之中介者模式

    介绍 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要内容来自:http://www ...

  10. Java 设计模式之中介者模式

    本文继续23种设计模式系列之中介者模式.   定义 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互.   角色 抽象中介者: ...

随机推荐

  1. 关于最新版本react-native0.59.x构建的问题解决方案

    react-native的版本更新是真的快,几乎几天就是一个小版本,然而在这个过程中,对于新手来说,成功构建一个,并跑起来的项目,还是有一定难度的,各种问题,一不小心,你就会发现你的时间全部都浪费在了 ...

  2. ES6(对象扩展)

    ES6(对象(object)新增特性) 1.简介表示法 o,k 为属性:这种为无方法的情况. 这种为有方法. 2.属性表达式 ES6中,[a]就是 b . 3.新增API 1.数组也是引用类型 2.O ...

  3. 有上下界的网络流 loj115 loj116 loj 117

    参考文章 无源汇有上下界的可行流 有源汇有上下界的最大流 有源汇有上下界的最小流 无源汇有上下界可行流 以 loj115 为例. 剥离出必要边与自由边. #include <iostream&g ...

  4. Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现

     Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现 LayerDrawable实现的结果和附录文章1,2,3中的layer-list一致. ...

  5. POJ 1159 字符串匹配问题

    题目大意: 问至少添加几个字符才能保证这个字符串是个回文串 一开始想也想不到字符串匹配上,因为是找回文串,我们可以把已给字符串逆向得到一个新的字符串,然后比较两者得到最大匹配长度,最后总长度减去最大匹 ...

  6. Atlantis(hdu1542)

    题意:求n个矩阵的面积并. /* 线段树维护扫描线 把每个矩形看成两条线段,从左到右添加线段,如果是矩形左边的线段,那就给线段所在的区间(y值)cover+1,反之则cover-1. 并且如果这条线段 ...

  7. PatentTips - Reducing Write Amplification in a Flash Memory

    BACKGROUND OF THE INVENTION Conventional NAND Flash memories move data in the background to write ov ...

  8. 百度统计的JS脚本原理解析

    一句话:在你的网站上加载百度统计的脚本,这个脚本会收集你的本地信息,然后发送给百度统计网站 https://blog.csdn.net/iqzq123/article/details/8877645 ...

  9. topcoder srm 550

    div1 250pt: 题意:有个机器人,从某一点出发,他只有碰到地形边缘或者碰到走过的点时才会改变运动方向,然后接着走,现在给出他的运动轨迹,判断他的运动是否合法,如果合法的话,那么整个地形的最小面 ...

  10. Capture and report JavaScript errors with window.onerror

    原文:https://blog.sentry.io/2016/01/04/client-javascript-reporting-window-onerror.html onerror is a sp ...