5.設(shè)計(jì)模式之裝飾模式

裝飾模式:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的指責(zé),就增加功能來說,裝飾模式比生成子類更加靈活

「裝飾模式」對(duì)于前端開發(fā)者而言一定是非常熟悉的,什么是「裝飾模式」呢?顧名思義,「裝飾模式」就像是給一個(gè)類穿上一件一件衣服,通過不同的搭配,讓這個(gè)類呈現(xiàn)出不同的特點(diǎn)。那我們?cè)诠ぷ鞯倪^程中,在編寫頁面的時(shí)候,做的好像也是一樣的事情對(duì)吧?比如按鈕組件,他會(huì)有defaultprimary、hoveractive、disabled等等狀態(tài),我們常用的方式就是通過給button添加不同的class來實(shí)現(xiàn)這種種不同的效果,其實(shí)這種實(shí)現(xiàn)的方式,就是「裝飾模式」的應(yīng)用。只不過今天我們說的是「裝飾模式」在JS中的應(yīng)用而已,我們可以通過CSS的思維來幫助我們理解。

實(shí)例:當(dāng)下我們需要做一套考試系統(tǒng),一套試卷由一道道試題組成,試題會(huì)有練習(xí)、考試和解析3種狀態(tài):

  • 練習(xí)狀態(tài)下,試題需要顯示題干和選項(xiàng)
  • 考試狀態(tài)下,試題需要顯示題干、選項(xiàng)和分?jǐn)?shù)
  • 解析狀態(tài)下,題干需要顯示題干、選項(xiàng)、分?jǐn)?shù)和解析

由上我們可以想象出具體的實(shí)現(xiàn)模式就是根據(jù)源數(shù)據(jù)在不同條件下顯示不同的狀態(tài)和內(nèi)容,就可以結(jié)合「裝飾模式」來實(shí)現(xiàn)。

// 試題渲染
class Question {
    constructor(question) {
        this.question = question;
    }
    
    render() {
        console.log(this.question.topic);
        console.log(this.question.options);
    }
}

// 分?jǐn)?shù)渲染裝飾器
class ScoreQuestion {
    constructor(question) {
        this.question = question;
    }
    
    render() {
        this.question.render();
        console.log(this.question.question.score);
    }
}

// 解析渲染裝飾器
class AnalyzeQuestion {
    constructor(question) {
        this.question = question;
    }
    
    render() {
        this.question.render();
        console.log(this.question.question.analyse);
    }
}

const question = {
    topic: '題干',
    options: '選項(xiàng)一、選項(xiàng)二、選項(xiàng)三',
    score: 10,
    analyse: '選項(xiàng)一是正確答案'
};

let instance = new Question(question);
instance.render();
// 題干
// 選項(xiàng)一、選項(xiàng)二、選項(xiàng)三

instance = new ScoreQuestion(instance);
instance.render();
// 題干
// 選項(xiàng)一、選項(xiàng)二、選項(xiàng)三
// 10

instance = new AnalyzeQuestion(instance);
instance.render();
// 題干
// 選項(xiàng)一、選項(xiàng)二、選項(xiàng)三
// 10
// 選項(xiàng)一是正確答案

總結(jié)

如果我們實(shí)現(xiàn)一項(xiàng)功能可以做到將核心指責(zé)與裝飾功能區(qū)分的話,就可以使用「裝飾模式」來實(shí)現(xiàn)?!秆b飾模式」的優(yōu)點(diǎn)就在于把類中的裝飾功能從類中搬移去除,這樣可以簡(jiǎn)化原有的類。


參考

大話設(shè)計(jì)模式 -- 程杰

個(gè)人博客

北落師門的博客

?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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