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

一,概念

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

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

二,类图

  

  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. PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '',-java.lang.Exception

    转https://stackoverflow.com/questions/29117679/spring-transactional-management-propagation-required-i ...

  2. LeetCode(21)Merge Two Sorted Lists

    题目 Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...

  3. 关于一个多个.cpp文件的项目中,函数出现未定义引用错误

    编译的话,必须把全部的c文件都要编译的啊,只编译一个c算怎么个逻辑呢?编译实际上是2个过程,编译和链接.编译过程只检查所有的符号(变量,函数)有没有声明,即只需要h文件生命就够了.但是链接时候,需要找 ...

  4. Leetcode 309.最佳买卖股票时机含冷冻期

    最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格.​ 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不 ...

  5. Python 和 Flask实现RESTful services

    使用Flask建立web services超级简单. 当然,也有很多Flask extensions可以帮助建立RESTful services,但是这个例实在太简单了,不需要使用任何扩展. 这个we ...

  6. mappedBy的作用

    mappedBy的意思就是"被映射",即mappedBy这方不用管关联关系,关联关系交给另一方处理 1.规律:凡是双向关联,mapped必设,因为根本都没必要在2个表中都存在一个外 ...

  7. Codeforces917D. Stranger Trees

    $n \leq 100$的完全图,对每个$0 \leq K \leq n-1$问生成树中与给定的一棵树有$K$条公共边的有多少个,答案$mod \ \ 1e9+7$. 对这种“在整体中求具有某些特性的 ...

  8. HDU 4622 (后缀自动机)

    HDU 4622 Reincarnation Problem : 给一个串S(n <= 2000), 有Q个询问(q <= 10000),每次询问一个区间内本质不同的串的个数. Solut ...

  9. PatentTips - Solid State Memory Wear Leveling

    BACKGROUND OF THE INVENTION Solid-state memory devices encompass rewritable non-volatile memory devi ...

  10. 2887 Big String

    splay瞎搞一下,正解是分块数组或分块链表,但是学不会啊! #include<cstdio> #include<cstdlib> #include<iostream&g ...