1.定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2.主要目的:
中转作用,通过中介者和其他对象进行通信;协调作用,中介者可以进一步的对对象之间的关系进行封装
中介者对象不能订阅消息,只有活跃对象才可订阅中介者的消息,中介者是消息的发送者
image.png
3.举例:购物车需求,比如购买手机时,购物车页面存在手机内存、颜色、购买数量等表单项,都会触发change事件,那么可以通过中介者来转发处理这些事件,实现各个事件间的解耦,仅仅维护中介者对象即可。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>中介者模式demo</title>
    <meta name="viewport"
        content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" />
</head>  
<body>
    <div>
        <div>
            <span>请选择颜色</span> 
            <select id="selColor">
                <option value="roseGold">玫瑰金</option>
                <option value="luxuryGold">土豪金</option>
            </select>
        </div>
        <div>
            <span>请选择内存:</span>
            <select id="selMemory">
                <option value="32G">32G</option>
                <option value="64G">64G</option>
            </select>
        </div>
        <div>
            <span>请输入购买数量:</span>
            <input type="text" id="selNum" /> 
        </div>
        <!-- <p style="color:red" id="tip"></p> -->
        <div style="padding-top:30px">
            <div>您选择的颜色为:</div><strong id="conColor"></strong>
            <div>您选择的内存为:</div><strong id="conMemory"></strong>
            <div>您选择的数量为:</div><strong id="conNum"></strong>
        </div>
    
        <button id="nextBtn">加入购物车</button>
    </div>
</body> 
<script>
    // 库存量
var goods = {
    "roseGold|32G": 10,
    "roseGold|64G": 5,
    "luxuryGold|32G": 8,
    "luxuryGold|64G": 6
};

var colorSelect = document.getElementById("selColor"),
        memorySelect = document.getElementById("selMemory"),
        numberInput = document.getElementById("selNum"),
        colorInfo = document.getElementById("conColor"),
        memeryInfo = document.getElementById("conMemory"),
        numberInfo = document.getElementById("conNum"),
        nextBtn = document.getElementById("nextBtn");

var mediator = (function() {
    return {
        changed: function(obj) {
            var color = colorSelect.value,  // 颜色
            memory = memorySelect.value,// 内存
            number = +numberInput.value, // 数量
            stock = goods[color + '|' + memory];// 对应颜色的库存量
            console.log("颜色:",color,"内存:",memory,"购买数量:",number,"库存:",stock)
            if(obj === colorSelect) {
                colorInfo.innerHTML = color;
            }else if(obj === memorySelect) {
                memeryInfo.innerHTML = memory;
            }else if(obj === numberInput) {
                numberInfo.innerHTML = number;
            }
            if(!color) {
                nextBtn.disabled = true;
                nextBtn.innerHTML = "请选择手机颜色";
                return;
            }

            if(!memory) {
                nextBtn.disabled = true;
                nextBtn.innerHTML = "请选择手机内存";
                return;
            }

            if(!number || (((number - 0) | 0) !== (number - 0))) {
                nextBtn.disabled = true;
                nextBtn.innerHTML = "请选择手机数量";
                return;
            }

            if( number > stock) {
                nextBtn.disabled = true;
                nextBtn.innerHTML = "库存不足";
                return;
            }

            nextBtn.disabled = false;
            nextBtn.innerHTML = "加入购物车";
        }
    };
})();
colorSelect.onchange = function() {//改变颜色
    mediator.changed(this);
};
memorySelect.onchange = function() {//改变内存
    mediator.changed(this);
};
numberInput.oninput = function() {//输入数量
    mediator.changed(this);
}
</script>
</html>

4.优缺点:
优点:
中介者使各对象之间耦合松散,而且可以独立地改变它们之间的交互
中介者和对象一对多的关系取代了对象之间的网状多对多的关系
让每个对象了解最少的内容,这样做对于大型程序来说是非常有益的
缺点:
一个中介者如果管理的对象过多,可能会导致中介者本身难以维护,过度集中化,容易出现故障

5.应用场景
(1)数据驱动:数据充当中介者角色,通过数据让各ui之间协同工作。
(2)当一个系统对象很多,且之间关联关系很复杂,交叉引用容易产生混乱时适合用中介者模式重构


Delia
75 声望3 粉丝

路漫漫其修远兮,吾将上下而求索。