• javascript设计模式学习之十四——中介者模式


    一、中介者模式的定义和应用场景

    中介者模式的作用在于解除对象之间的紧耦合关系,增加一个中介者之后,所有对象都通过中介者来通信,而不是互相引用,当一个对象发生变化的时候,仅需要通知中介者即可。从而将网状的多对多关系转换为了简单的一对多关系。

    中介者模式使得各个对象之间得以解耦,以中介者和对象之间一对多的关系取代了多个对象之间多对多的关系,其缺点在于将对象之间的复杂性转移到了中介者对象的复杂性,系统增加的这个中介者对象往往是复杂和难以维护的,往往当对象之间的耦合度呈指数增长的时候,就需要考虑引入中介者模式。

    二、中介者模式应用案例

    假设正在编写一个手机购买页面,购买路程中,用户可以选择手机颜色及手机内存大小,同时页面有两个展示区域,分别显示用户选择好的颜色,内存大小,输入数量。还有一个按钮提示下一步的操作,如果操作不对则提示对应的提示信息,否则显示加入购物车。

    页面的元素有多个,每一个元素的变化都会对按钮的行为产生影响,使用中介者模式实现代码如下:

    var stocks={
        'red|16G':5,
        'red|32G':10,
        'blue|16G':7,
        'blue|32G':6
    };
    var colorSelect=document.getElementById('colorSelect');
    var memorySelect=document.getElementById('memorySelect');
    var numInput=document.getElementById('numInput');
    var colorInfo=document.getElementById('colorInfo');
    var memoryInfo=document.getElementById('memoryInfo');
    var numInfo=document.getElementById('numInfo');
    var btn=document.getElementById('btn');
    
    var mediator=(function(){
        return {
            change:function(obj){
                var color=colorSelect.value;
                var memory=memorySelect.value;
                //console.log(numInput.value);
                var num=parseInt(numInput.value,10);
                //console.log(num);
                //ݫעʺהгքѾʭԫ֝ٸאީ֟ìʹփאީ֟ࠉӔʶҰע̍֟
                if(obj===colorSelect){
                    colorInfo.innerHTML=color;
                }else if(obj==memorySelect){
                    memoryInfo.innerHTML=memory;
                }else if(obj===numInput){
                    numInfo.innerHTML=num;
                }
                
                if(!color){
                    btn.disabled=true;
                    btn.innerHTML='请选择颜色';
                    return;
                }
                if(!memory){
                    btn.disabled=true;
                    btn.innerHTML='请选择内存大小';
                    return;
                }
                var stock=stocks[color+'|'+memory];
            //    console.log(stock);
             
                if(num>stock){
                    console.log('num>stock');
                    btn.disabled=true;
                    btn.innerHMTL='库存不足';
                    return;
                }
                btn.disabled=false;
                btn.innerHTML='加入购物车';
            }
        };
        
    })();
    colorSelect.onchange=function(){
        mediator.change(this);
    };
    memorySelect.onchange=function(){
        mediator.change(this);
    };
    numInput.oninput=function(){
        mediator.change(this);
    };
     
  • 相关阅读:
    网页制作之JavaScript部分3--事件及事件传输方式(函数调用 练习题 )重要---持续更新中
    网页制作之JavaScript部分 2
    网页制作之JavaScript部分 1
    css之display:inline-block与float区别(可以尝试用一下)
    边框圆角化方式(原文链接http://www.cnblogs.com/SJP666/p/4678730.html)
    网页制作之html基础学习5-background-position用法
    网页制作之html基础学习4-格式与布局
    网页制作之html基础学习3-css样式表
    网页制作之html基础学习2-标签
    程序员的成长必备
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/5671123.html
Copyright © 2020-2023  润新知