JavaScript設(shè)計模式之裝飾器模式

介紹

  • 為對象添加新功能
  • 不改變其原有的結(jié)構(gòu)和功能

實例

  • 手機殼(只是增加裝飾苫昌、防摔功能)

UML

image
  • 通過DecortorCircle新增setRedBorder()方法

代碼演示

    //圓
    class Circle{
        draw(){
            console.log('畫一個圓')
        }
    }
    //裝飾器
    class Decorator{
        constructor(circle){
            this.circle = circle
        }
        draw(){
            this.circle.draw()
            this.setRedBorder(circle)
        }
        setRedBorder(circle){
            console.log('設(shè)置了紅色邊框')
        }
    }

    //測試
    let circle = new Circle()
    circle.draw()

    let dec = new Decorator(circle)

    dec.draw()
  • result


    image

場景

  • es7裝飾器
  • code-decorators

es7裝飾器

  • 配置環(huán)境
  • 裝飾類
  • 裝飾方法
配置環(huán)境
  • 安裝插件
 npm install babel-plugin-transform-decorator-legacy --save-dev
  • 修改.babelrc
    {
        "plugins":["transform-decorator-legacy"]
    }
裝飾類
  • 普通裝飾類
    //裝飾類
    @testDec
    class Demo{
            // ...
    }
    function testDec(target) {
        target.isDec = true
    }
     alert(Demo.isDec) //true
  1. @testDec為Class增加了一個裝飾器`
  2. target其實就是Demo
  • 帶參數(shù)
        @testDec
        @testDecParams(false)
        class Demo{
            // ...
        }
        //裝飾類 不帶參數(shù)
        function testDec(target) {
            target.isDec = true
        }

        alert(Demo.isDec) //true

        //裝飾類 帶參數(shù)
        function testDecParams(isDec) {
            return function (target) {
                target.isDec = isDec
            }
        }
  • mixins實例
    function  mixins(...list) {
        return function (target) {
            Object.assign(target.prototype,...list)
        }
    }
    const Foo = {
        foo(){
            alert('foo')
        }
    }
    @mixins(Foo)
    class MyClass{

    }

    let obj = new MyClass()
    obj.foo()
裝飾方法
     class Person{
        constructor(){
            this.first = 'A'
            this.last = 'B'
        }

        //裝飾方法
        @readOnly
        name(){
            return this.first +'-' + this.last
        }
    }
    function readOnly(target,name,descriptor) {
        //descriptor 屬性描述對象
        // {
        //     value:specifiedFunction,
        //     enmerable:false,
        //     configurable:true,
        //     writable:true
        // }
        descriptor.writable = false
        return descriptor
    }

    const  p = new Person()
    console.log(p.name())
    //p.name = function(){} //報錯  只讀
  • 定義一個只讀方法啦撮,修改屬性描述對象中的是否可寫

場景

  • core-decorators 提供常用的裝飾器

原文:https://www.ahwgs.cn/javascriptshejim…zhuangshiqimoshi.html
代碼:https://github.com/ahwgs/design-pattern-learning/tree/master/6.JavaScript%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E8%A3%85%E9%A5%B0%E5%99%A8%E6%A8%A1%E5%BC%8F

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桶良,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毁欣,老刑警劉巖昭躺,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異幔翰,居然都是意外死亡漩氨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門遗增,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叫惊,“玉大人,你說我怎么就攤上這事做修』粽” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵饰及,是天一觀的道長蔗坯。 經(jīng)常有香客問我,道長燎含,這世上最難降的妖魔是什么宾濒? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮屏箍,結(jié)果婚禮上绘梦,老公的妹妹穿的比我還像新娘。我一直安慰自己赴魁,他們只是感情好卸奉,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颖御,像睡著了一般榄棵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潘拱,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天疹鳄,我揣著相機與錄音,去河邊找鬼泽铛。 笑死尚辑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盔腔。 我是一名探鬼主播杠茬,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼月褥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓢喉?” 一聲冷哼從身側(cè)響起宁赤,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栓票,沒想到半個月后决左,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡走贪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年佛猛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坠狡。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡继找,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逃沿,到底是詐尸還是另有隱情婴渡,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布凯亮,位于F島的核電站边臼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏假消。R本人自食惡果不足惜柠并,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望置谦。 院中可真熱鬧堂鲤,春花似錦亿傅、人聲如沸媒峡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谅阿。三九已至,卻和暖如春酬滤,著一層夾襖步出監(jiān)牢的瞬間签餐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工盯串, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氯檐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓体捏,卻偏偏與公主長得像冠摄,于是被迫代替她去往敵國和親糯崎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容