裝飾者模式

裝飾者模式:在不改變對(duì)象的基礎(chǔ)上,通過(guò)對(duì)齊進(jìn)行包裝擴(kuò)展(添加屬性或者方法)使原有對(duì)象可以滿足用戶的梗復(fù)雜需求。

裝飾者模式是對(duì)原有功能的一中增強(qiáng)與擴(kuò)展,不需要了解原有功能的基礎(chǔ)上對(duì)功能擴(kuò)展,只是在外部進(jìn)行一次性封裝擴(kuò)展,這是對(duì)原有功能完整性的一種保護(hù)。
與適配器模式不同的是,適配器模式進(jìn)行擴(kuò)展基本是對(duì)對(duì)象內(nèi)部結(jié)構(gòu)的重組,需要了解原有功能。

需求1:
舊需求:以前是當(dāng)用戶點(diǎn)擊輸入框時(shí),如果如輸入輸入的內(nèi)容有限制,那么其后面顯示用戶輸入內(nèi)容的限制格式的提示文案。
新需求:現(xiàn)在多加一條,默認(rèn)輸入框上班顯示一行提示文案,當(dāng)用戶點(diǎn)擊輸入框時(shí)文案消失。

舊代碼

//輸入框元素
const telInput = document.querySelector('#tel_input');
//輸入格式提示文案
const telWarnText = document.querySelector('#tel_warn_text');
//點(diǎn)擊輸入框顯示輸入框格式提示文案
input.onclick = function(){
    telWarnText.style.display = 'inline-block';
}

新代碼

//輸入框元素
const telInput = document.querySelector('#tel_input');
//輸入框輸入格式提示文案
const telWarnText = document.querySelector('#tel_warn_text');
//輸入框提示輸入文案
const telTipText = document.querySelector('#tel_tip_text');
//點(diǎn)擊輸入框顯示輸入框格式提示文案
input.onclick = function(){
    telWarnText.style.display = 'inline-block';
    telTipText.style.display = 'none';
}

問(wèn)題1:修改了一個(gè)電話輸入框,還有姓名輸入框,地址輸入框等等。難道要找出代碼一個(gè)個(gè)去修改?
優(yōu)化1:裝飾者模式(在原有的功能的基礎(chǔ)上,添加一些功能來(lái)滿足用戶提出的需求)

//裝飾者
const decorator = function(input,fn){
    //獲取事件源
    const input = document.querySelector(input);
    //已綁定過(guò)事件
    if(typeof input.onlick = 'function'){
        //緩存事件源原有回調(diào)函數(shù)
        const oldClickFn = input.onclick;
        //為事件源定以新的事件
        input.onclick = funciton(){
            //事件源原有回調(diào)函數(shù)
            oldClickFn();
            //執(zhí)行時(shí)間源新增回調(diào)函數(shù)
            fn();
        }
    }else{
        //事件源未綁定事件,直接為事件添加回調(diào)函數(shù)
        input.onclick = fn
    }
    //todo other
}

裝飾者函數(shù)不僅可以對(duì)綁定過(guò)事件的輸入框添加新的功能,未綁定過(guò)事件的輸入框同樣可以

//電話輸入框功能裝飾
decorator('tel_input',()=>{
    document.querySelector(`#tel_tip_text`).style.display = 'none'
})
//姓名輸入框功能裝飾
decorator('name_input',()=>{
    document.querySelector(`#name_tip_text`).style.display = 'none'
})
//地址輸入框功能裝飾
decorator('adress_input',()=>{
    document.querySelector(`#adress_tip_text`).style.display = 'none'
})

通過(guò)使用裝飾者對(duì)象方法,物流輸入框是否綁定過(guò)事件,都可以完成增加隱藏提示信息的需求。
裝飾者就是對(duì)原有對(duì)象的屬性和方法的添加。

與適配器模式不同的是,適配器方法是對(duì)原有對(duì)象適配,添加的方法與原有方法功能上大致相似。
但是裝飾者提供的方法與原來(lái)的方法功能項(xiàng)是有一定區(qū)別的。
再有,使用適配器是新增的方法是要調(diào)用原來(lái)的方法的。
在裝飾者模式中,不需要了解對(duì)象原有功能,擯棄對(duì)對(duì)象原有的方法可以原封不動(dòng)地使用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 本文的主要內(nèi)容: 介紹裝飾者模式 示例 源碼分析裝飾者模式的典型應(yīng)用Java I/O 中的裝飾者模式spri...
    小旋鋒的簡(jiǎn)書(shū)閱讀 1,404評(píng)論 0 3
  • 本篇文章介紹一種設(shè)計(jì)模式——裝飾者模式。裝飾者模式在Java中的典型應(yīng)用就是IO流,在本篇文章中將有詳細(xì)介紹。本篇...
    Ruheng閱讀 22,466評(píng)論 13 56
  • 在《JAVA與模式》一書(shū)開(kāi)頭是這樣描述裝飾(Decorator)模式的: 裝飾模式又名包裝模式。裝飾模式以對(duì)客戶端...
    笨笨翔閱讀 419評(píng)論 0 2
  • 設(shè)計(jì)原則: 少用繼承,多用組合 類應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉 目錄 本文的結(jié)構(gòu)如下: 什么是裝飾者模式 為什么要用...
    w1992wishes閱讀 1,297評(píng)論 0 7
  • 設(shè)計(jì)模式 一、什么是裝飾模式 裝飾者模式動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方...
    凱玲之戀閱讀 1,142評(píng)論 0 2

友情鏈接更多精彩內(nèi)容