Decorator(裝飾者模式)

目的

動態的給某個物件增加一些額外的職責,一種實現繼承的替代方法

在不改變原本物件的基礎上,通過其進行包裝與擴展,使原有物件可以滿足用戶得更複雜需求,也不會影響到原本的物件

Code

class MacBook {
    cost() {
        return 997;
    }
    screenSize() {
        return 11.6;
    }
}

function Memory(macbook) {
    let v = macbook.cost();
    macbook.cost = function() {
        return v + 75;
    };
}
// Decorator 2
function Engraving(macbook) {

    let v = macbook.cost();
    macbook.cost = function() {
        return v + 200;
    };
}
// Decorator 3
function Insurance(macbook) {
    let v = macbook.cost();
    macbook.cost = function() {
        return v + 250;
    };
}
let mb = new MacBook();
Memory(mb);
Engraving(mb);
Insurance(mb);
console.log(mb.cost());// Outputs: 1522
console.log(mb.screenSize());// Outputs: 11.6

優點

  • 只關心自身的核心任務,實現解耦

  • 方便動態擴充功能,比繼承多了更多的靈活性

缺點

  • 多層的話會較複雜

  • 常常引入小物件,看起來相似,實際功能卻不對,讓我們的架構變得複雜

Last updated