美文网首页
外观模式

外观模式

作者: helloyoucan | 来源:发表于2019-05-15 09:13 被阅读0次

外观模式:为一组复杂的子系统接口提供一个更高级的统一接口,通过这个接口使得对子系统的访问更加容易。在JavaScript中又是也会对底层结构兼容性做统一封装来简化使用。

需求1:点击页面文档隐藏提示框

document.onclick = funcion(e){
   e.preventDefault()
   if(e.target !=== document.getElementById('myinput')){
       hidePageAlert()
   }
}
function hidePageAlert(){
//隐藏提示框
}

问题1:使用DOM2级事件处理程序提供的方法AddEventListener,
但是IE9以下不支持,所以要用attachEvent,
若不支持DOM2级事件,则只能用onclick事件方法绑定事件
优化1:统一功能接口方法不统一,可以通过外观模式提供一个简单高级的接口,简化对负责的底层接口不同意的使用需求

//外观模式实现
function AddEvent(dom,type,fn){
    //对于支持DOM2级事件处理程序使用addEventListener方法的浏览器
    if(dom.addEventListener){
        dom.addEventListener(type,fn,false)
    }else if(dom.attachEvent){//不支持addEventListener的浏览器
        dom.attachEvent('on'+type,fn)
    }else{//不支持DOM2级事件(addEventListener和attachEvent)
        dom['on'+type] = fn
    }
}

外观模式处理适用于简化底层接口的复杂性,还可以用于浏览器兼容性问题

//获取事件对象
const getEvent = funcion(event){
    //标准浏览器返回event,IE下window.event
    return event||window.event
}
//获取元素
const getTarget = funcion(event){
    const event = getEvent(event)
    //标准浏览器下event.target,IE下event.srcElement
    return event.target||event.srcElement
}
//阻止默认行为
const preventDefault = funcion(event){
    const event = getEvent(event)
    // 标准浏览器
    if(event.preventDefault){
        event.preventDefault()
    }else{// IE浏览器
        event.returnValue = false
    }
}

代码库通过外观模式来分钟多个功能,简化底层操作方法

//简约版属性样式方法库
const A = {
    //通过IE获取元素
    g(id){return document.getElementById(id)},
    // 设置元素css属性
    css(id,key,value){
        document.getElementById(id).style[key] = value
    },
    // 设置元素属性
    attr(id,key,value){
        document.getElementById(id)[key] = value
    },
    html(id,html){
        document.getElementById(id).innerHTML = html
    },
    //为元素绑定事件
    on(id,type,fn){
        document.getElementById(id)['on'+type] = fn
    }

}
A.g('id')

当一个负复杂系统提供一系列复杂的接口方法时,为系统的管理方便会造成接口方法的使用极其复杂,
通过外观模式,对接口的二次封装隐藏其复杂性,简化使用。
但是这种设计增加了一些资源开销以及程序的复杂度。

外观模式是对接口方法的外层包装,以供上层代码调用。
因此有时外观模式封装接口方法不需要接口的具体实现,只需按照接口的使用规则使用即可。
这也是对系统与客户(使用者)之间的一种松散耦合。
使系统与客户之间不会因结构的变化而相互影响。

相关文章

网友评论

      本文标题:外观模式

      本文链接:https://www.haomeiwen.com/subject/ucsuaqtx.html