资讯专栏INFORMATION COLUMN

设计模式之中介者模式

shixinzhang / 2674人阅读

摘要:用中介者模式实现土豆馒头豆包地瓜土豆馒头豆包地瓜土豆馒头输出缺陷使用中介者模式可以很大程度上避免对象之间的相互影响,无论是对于代码的可读性以及逻辑性都可以简化。

中介者模式

我们知道在程序中各个对象之间并不是完全独立的,相互之间是可能存在关系的,并且可能会相互影响的,就像这样。

很明显这样复杂的对象关系管理起来是很混乱的。但是如果我们把它改变成下面这个样子可能就不太一样了。

即通过一个中间对象分发通知,使各个对象之间得以解耦,从混乱的多对多关系变成了对象和中介者之间的多对一关系。每当我们要新增加一个功能或者对象的时候,只需要对中介者做一些改动即可。
中介者其实就像一个航空调度员一样,如果有两架飞机凑巧航线很近,起飞降落时间也很接近的话,调度员可能就会对其中一架飞机发起通知,告诉它改变航线,或者改变降落地点,以此来避免航空事故的发生。

5v5对战

玩过LOL或者DATA的同学都知道,这是一个合作的游戏,每一个队友的生死都关系着游戏的输赢。我们要随时观察队友的状态,看看是不是少人,能否发起团战,看看队友的血量蓝量,身为辅助的队友可能要随用加血加蓝。当然这都不是最重要的,不怕神一样的对手,就怕...一样的队友,哈哈哈。

用中介者模式实现
class Player {
    constructor(name, color, status) {
        this.name = name
        this.color = color
        this.status = status
    }

    rebirth(name) {
        console.log(`${name}: rebirth`)
        agent.receiveMessage("playerRebirth", this)
    }

    die(name) {
        console.log(`${name}: died`)
        agent.receiveMessage("playerDead", this)
    }

    win() {
        console.log(`${this.name}: win`)
    }

    lose() {
        console.log(`${this.name}: lose`)
    }
}

const allPlayer = { }
const agent = {
    playerRebirth (player) {
        allPlayer[player.color] = allPlayer[player.color] || {}
        allPlayer[player.color][player.name] = player
    },
    playerDead (player) {
        allPlayer[player.color][player.name].status = "die"
        let allDead = true
        Object.keys(allPlayer[player.color]).map((member) => {
            if (allPlayer[player.color][member].status === "live") {
                allDead = false
            }
        })
        if (allDead) {
            Object.keys(allPlayer[player.color]).map((member) => {
                allPlayer[player.color][member].lose()
            }) 
            Object.keys(allPlayer).map((team) => {
                if (team !== player.color) {
                    Object.keys(allPlayer[team]).map((member) => {
                        allPlayer[team][member].win()
                    })
                }
            })
        }
    },

    receiveMessage() {
        const message = Array.prototype.shift.call(arguments)
        agent[message].apply(this, arguments)
    }
}

const player1 = new Player("土豆", "red", "live")
const player2 = new Player("馒头", "red", "live")
const player3 = new Player("豆包", "blue", "live")
const player4 = new Player("地瓜", "blue", "live")
player1.rebirth("土豆")
player2.rebirth("馒头")
player3.rebirth("豆包")
player4.rebirth("地瓜")
console.log(allPlayer, "all member be ready")
player1.die("土豆")
player2.die("馒头")
console.log(allPlayer, "one team is lose")

输出:

缺陷

使用中介者模式可以很大程度上避免对象之间的相互影响,无论是对于代码的可读性以及逻辑性都可以简化。
但是不可否认的是它会创建新的对象占用一部分内存,而且这个对象随着业务逻辑的增加会变得很庞大也可能导致难以维护。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81917.html

相关文章

  • 实用模式介者模式

    摘要:好,师傅我们要学习帝吧人民,进能打,退能刷淘宝。恩,大致过程就是这样,我们使用中介者模式想一想。首先,数据需要放在中介者模式内,用户的一切操作,都会传递给中介者模式,由他来选择是哪一个部分发生改变。 俗话说,一个模式三个坑。 中介者模式应该算最坑的一个模式,坑不在于他的原理。而在于他的名字和其他模式的使用,真尼玛像。首先,中介者 好像是一切模式里面都有的一个东西,比如,享元模式中-元对...

    AlexTuan 评论0 收藏0
  • javascript介者模式

    摘要:中介者模式中介者模式对象和对象之间借助第三方中介者进行通信。将就用下这个这个函数充当中介者挑戰成功挑战失败选手选手选手选手挑战成功选手挑战成功选手挑战失败在这段代码中之间没有直接发生关系而是通过另外的对象建立链接姑且将之当成是中介者模式了。 中介者模式 中介者模式: 对象和对象之间借助第三方中介者进行通信。 showImg(https://segmentfault.com/img/bV...

    LucasTwilight 评论0 收藏0
  • 设计模式介者模式

    摘要:中介者模式的应用中介者模式的优点就是减少类间的依赖,将一对多的依赖变成一对一的依赖,降低耦合,符合迪米特法则。中介者模式适用于多个对象之间出现紧密联系,类图成网状结构,使用中介者模式可以梳理为星型结构,有助于理解其关系。 前言 由于最近疯狂加班,博客都停更许久,难过~.~ 中介者模式定义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以...

    jackwang 评论0 收藏0
  • 一起学设计模式 - 介者模式

    摘要:在地球上最大的中介者就是联合国了,它主要用来维护国际和平与安全解决国际间经济社会文化和人道主义性质的问题。所以对于关系比较复杂的系统,我们为了减少对象之间的关联关系,使之成为一个松耦合系统,我们就需要使用中介者模式。 中介者模式(Mediator Pattern)属于行为型模式的一种,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独...

    denson 评论0 收藏0
  • 忘了再看设计模式-行为型

    摘要:推文用设计模式解构三国是一种什么体验行为型设计模式一策略模式工厂模式优化结构状态模式随着状态改变而改变行为。推文状态机与状态模式责任链模式多个对象依次处理请求前者指定后者。代理模式代理针对一个对象,为了增加控制等中介双方都是多个,为了解耦。 策略模式 选择使用封装好的一系列算法,可相互替换。 类比:商店[Context]买完衣服买单[Stratege](现金[Concrete Stra...

    ShevaKuilin 评论0 收藏0

发表评论

0条评论

shixinzhang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<