裝飾器模式

1. 裝飾器模式.

裝飾者模式(Decorator): 在不改變原對象的基礎(chǔ)上,對其進(jìn)行包裝擴(kuò)展,以滿足更復(fù)雜的需求.

1.1 為什么使用裝飾器模式

一般情況下, 我們?yōu)榱藬U(kuò)展一個類經(jīng)常用到繼承的方式實(shí)現(xiàn),由于繼承為類引入了靜態(tài)體征,并且隨著功能的增多,子類會越來越大.

這時我們可以用到裝飾器模式,給子類進(jìn)行擴(kuò)展,裝飾器和被裝飾類可以獨(dú)立發(fā)展,不會相互耦合,裝飾模式時繼承模式的一個替代模式,裝飾模式可以動態(tài)擴(kuò)展一個實(shí)現(xiàn)類的功能.

  • 場景一
// Student實(shí)例類
class Student{
    constructor(name,sex,hobby){
        this.name = name;
        this.sex = sex
        this.hobby = hobby
    }
    showName(){
        console.log(this.name);
    }
}
  // 實(shí)例使用
const zhangsan = new Student('張三','男',"打籃球"),
      lisi = new Student('李四', '男', "看書"),
      wangwu = new  Student('王五', '男', "學(xué)習(xí)");
// 現(xiàn)在我們需要對lisi實(shí)例(或個別實(shí)例), 進(jìn)行添加新的屬性的擴(kuò)展
// 很顯然此時不能直接擴(kuò)展到Student類上,不然會影響到其他實(shí)例
//如果繼承,那么需要重新實(shí)例化新的,不必要而且浪費(fèi)
//此時我們可以使用裝飾器模式在以有的實(shí)例上稍做裝飾就能滿足需求
 function Decorator(instance,options){
     for(let [key,val] of Object.entries(options)){
         // 如果不存在對應(yīng)的屬性就給目標(biāo)對象添加對應(yīng)的屬性值
         if (!Reflect.get(instance, key)) {
             Reflect.defineProperty(instance, key, {
                 value: val,
             })
         }else{
             console.error(`target Object an existing ${key} attribute`)
         }
     }
    }
// 利用裝飾器函數(shù)給lisi實(shí)例添加一個age屬性,和sayAge方法
Decorator(lisi, { age: 12,sayAge(){
    console.log(this.age);
}})
lisi.sayAge()// 12
lisi.sayName()//李四
 let arr = [ 4,324,4,43,43];
// 假設(shè)我們要給數(shù)組的實(shí)例arr添加一個方法,顯然我們?nèi)绻迷屠^承給Array的原型添加方法是不合適的
// 此時我們也可以使用裝飾器模式
Decorator(arr,{
    max(){
        return  Math.max.call(null, ...this)
    }
})  
arr.max();// 324            

更復(fù)雜的裝飾器模式還可以繼續(xù)抽象為類,實(shí)現(xiàn)對對象的擴(kuò)展.

總結(jié):裝飾器模式是一種常見的結(jié)構(gòu)型模式,我們可以以一個基礎(chǔ)對象為基礎(chǔ),來給它加上若干個裝飾對齊以擴(kuò)展其功能,裝飾模式也是一種更靈活的繼承方案,對對象進(jìn)行多需要的擴(kuò)展而不需要重新繼承構(gòu)造出新的實(shí)例.

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

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