JS設計模式初識(十一)-中介者模式

定義

中介者模式的做用就是解除對象與對象之間的緊耦合關係。增長一箇中介者對象後,全部的 相關對象都經過中介者對象來通訊,而不是互相引用,因此當一個對象發生改變時,只須要通知 中介者對象便可。中介者使各對象之間耦合鬆散,並且能夠獨立地改變它們之間的交互。中介者模式使網狀的多對多關係變成了相對簡單的一對多關係bash

11.1 基本知識

當不使用中介者模式的時候,每一個人每一個物體之間都會產生一些錯綜複雜的聯繫 , 若是要修改中間某一個對象都得當心翼翼, 由於會牽一髮而動全身。以下圖11-1: app

以下圖11-2使用中介者模式後:在圖11-1中若是對象A發生了改變,則須要同時通知跟A發生引用關係的 B、D、E、F 這 4 個對象;而在圖14-2中,使用中介者模式改進以後,A 發生改變時則只須要通知這個中介者 對象便可。ui

11.2 實現個小遊戲

玩家可加入不一樣顏色的隊伍this

// 中介者
    const playerDirector = (function() {
        const players = {}; // all player
        const operations = {}; // 能執行的操做
    
        operations.addPlayer = (player) => {
            const { teamColor, name } = player;
            const colorTeams = players[teamColor] || [];
            colorTeams.push(player);
        }
        operations.removePlayer = (player) => {
            const { teamColor } = player;
            players[teamColor] = colorTeams.filter((item) => item === player);
    
        }
        operations.playerDead = (player) => {
            const { teamColor } = player;
            let colorTeams = players[teamColor];
            const hasAlive = colorTeams.find((item) => item.state === 'alive');
            const allDead = !hasAlive;
    
            if (allDead) {
                colorTeams.forEach((item) => { item.lose() });
                for (let color in players) {
                    if (color !== teamColor) {
                        players[color].forEach((item) => { item.win() });
                    }
                }
            }
        }
        operations.changeTeam = (player, newTeamColor) => {
            const { teamColor } = palyer;
            operations.removePlayer(player);
            palyer.teamColor = newTeamColor;
            operations.addPlayer(palyer)
        }
        return {
            reciveMessage: (message, ...args) => operations[message].apply(this, args),
        }
    })();
    
    // 玩家類
    function Player(name, teamColor) {
        this.name = name;
        this.teamColor = teamColor;
        this.state = 'alive';
    }
    Player.prototype.win = function() {
        console.log(this.name+' won',);
    }
    Player.prototype.lose = function() {
        console.log(this.name+' lose');
    }
    Player.prototype.die = function() {
        this.state = 'dead';
        playerDirector.reciveMessage('playerDead', this);
    }
    Player.prototype.changeTeam = function(newTeamColor) {
        playerDirector.reciveMessage('changeTeam', this, newTeamColor);
    }
    
    // 玩家工廠
    function PlayerFactory(palyer, color) {
        const newPlayer = new Player(player, color);
        playerDirector.reciveMessage('addPlayer', newPlayer);
    }
複製代碼

11.3 總結

中介者模式使各個對象之間得以解耦,以中介者和對象之間的一對多關係取代了對象 之間的網狀多對多關係。各個對象只需關注自身功能的實現,對象之間的交互關係交給了中介者 對象來實現和維護。 不過,中介者模式也存在一些缺點。其中,最大的缺點是系統中會新增一箇中介者對象,因 爲對象之間交互的複雜性,轉移成了中介者對象的複雜性,使得中介者對象常常是巨大的。中介 者對象自身每每就是一個難以維護的對象。spa

相關文章
相關標籤/搜索