zoukankan      html  css  js  c++  java
  • 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);
    };
     
  • 相关阅读:
    Monkey Studio IDE | The way IDEs should be
    ImportError: No module named pysqlite2 chinacloud 博客园
    EF架构——code first开发中,在修改实体时,自动影响到数据表上
    你必须要知道的架构知识~目录
    MVC中业务层是否应该有个基类?它有什么作用?
    解决COOKIES存储中文乱码的问题
    C#代码是更具艺术性的,选择她,因为喜欢她
    arm驱动程序——按键程序6_互斥1—原子操作(韦东山的视频总结及针对linux2.6.30)
    Oracle体系结构及备份(十)——sgaothers_pool
    Linux进程间通信(三)管道通信之有名管道及其基础实验
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/5671123.html
Copyright © 2011-2022 走看看