国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

每天一個(gè)設(shè)計(jì)模式之裝飾者模式

shleyZ / 1721人閱讀

摘要:作者按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用和兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式原文地址是每天一個(gè)設(shè)計(jì)模式之裝飾者模式歡迎關(guān)注個(gè)人技術(shù)博客。

作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascriptpython兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式 :)

原文地址是:《每天一個(gè)設(shè)計(jì)模式之裝飾者模式》

歡迎關(guān)注個(gè)人技術(shù)博客:godbmw.com。每周 1 篇原創(chuàng)技術(shù)分享!開源教程(webpack、設(shè)計(jì)模式)、面試刷題(偏前端)、知識(shí)整理(每周零碎),歡迎長期關(guān)注!

如果您也想進(jìn)行知識(shí)整理 + 搭建功能完善/設(shè)計(jì)簡約/快速啟動(dòng)的個(gè)人博客,請(qǐng)直接戳theme-bmw

0. 項(xiàng)目地址

裝飾者模式·代碼

《每天一個(gè)設(shè)計(jì)模式》地址

1. 什么是“裝飾者模式”?
裝飾者模式:在不改變對(duì)象自身的基礎(chǔ)上,動(dòng)態(tài)地添加功能代碼。

根據(jù)描述,裝飾者顯然比繼承等方式更靈活,而且不污染原來的代碼,代碼邏輯松耦合。

2. 應(yīng)用場(chǎng)景

裝飾者模式由于松耦合,多用于一開始不確定對(duì)象的功能、或者對(duì)象功能經(jīng)常變動(dòng)的時(shí)候。
尤其是在參數(shù)檢查參數(shù)攔截等場(chǎng)景。

3. 代碼實(shí)現(xiàn) 3.1 ES6 實(shí)現(xiàn)

ES6的裝飾器語法規(guī)范只是在“提案階段”,而且不能裝飾普通函數(shù)或者箭頭函數(shù)。

下面的代碼,addDecorator可以為指定函數(shù)增加裝飾器。

其中,裝飾器的觸發(fā)可以在函數(shù)運(yùn)行之前,也可以在函數(shù)運(yùn)行之后。

注意:裝飾器需要保存函數(shù)的運(yùn)行結(jié)果,并且返回。

const addDecorator = (fn, before, after) => {
  let isFn = fn => typeof fn === "function";

  if (!isFn(fn)) {
    return () => {};
  }

  return (...args) => {
    let result;
    // 按照順序執(zhí)行“裝飾函數(shù)”
    isFn(before) && before(...args);
    // 保存返回函數(shù)結(jié)果
    isFn(fn) && (result = fn(...args));
    isFn(after) && after(...args);
    // 最后返回結(jié)果
    return result;
  };
};

/******************以下是測(cè)試代碼******************/

const beforeHello = (...args) => {
  console.log(`Before Hello, args are ${args}`);
};

const hello = (name = "user") => {
  console.log(`Hello, ${name}`);
  return name;
};

const afterHello = (...args) => {
  console.log(`After Hello, args are ${args}`);
};

const wrappedHello = addDecorator(hello, beforeHello, afterHello);

let result = wrappedHello("godbmw.com");
console.log(result);
3.2 Python3 實(shí)現(xiàn)

python直接提供裝飾器的語法支持。用法如下:

# 不帶參數(shù)
def log_without_args(func):
    def inner(*args, **kw):
        print("args are %s, %s" % (args, kw))
        return func(*args, **kw)
    return inner

# 帶參數(shù)
def log_with_args(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print("decorator"s arg is %s" % text)
            print("args are %s, %s" % (args, kw))
            return func(*args, **kw)
        return wrapper
    return decorator

@log_without_args
def now1():
    print("call function now without args")

@log_with_args("execute")
def now2():
    print("call function now2 with args")

if __name__ == "__main__":
    now1()
    now2()

其實(shí)python中的裝飾器的實(shí)現(xiàn),也是通過“閉包”實(shí)現(xiàn)的。

以上述代碼中的now1函數(shù)為例,裝飾器與下列語法等價(jià):

# ....
def now1():
    print("call function now without args")
# ... 
now_without_args = log_without_args(now1) # 返回被裝飾后的 now1 函數(shù)
now_without_args() # 輸出與前面代碼相同
4. 參考

JavaScript Decorators: What They Are and When to Use Them

《阮一峰ES6-Decorator》

《廖雪峰python-Decorator》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43068.html

相關(guān)文章

  • 每天一個(gè)設(shè)計(jì)模式裝飾模式

    摘要:作者按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用和兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式原文地址是每天一個(gè)設(shè)計(jì)模式之裝飾者模式歡迎關(guān)注個(gè)人技術(shù)博客。 作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式...

    brianway 評(píng)論0 收藏0
  • 設(shè)計(jì)模式裝飾模式

    摘要:相關(guān)設(shè)計(jì)模式裝飾者模式和代理模式裝飾者模式關(guān)注再一個(gè)對(duì)象上動(dòng)態(tài)添加方法代理模式關(guān)注再對(duì)代理對(duì)象的控制訪問,可以對(duì)客戶隱藏被代理類的信息裝飾著模式和適配器模式都叫包裝模式關(guān)于新職責(zé)適配器也可以在轉(zhuǎn)換時(shí)增加新的職責(zé),但主要目的不在此。 0x01.定義與類型 定義:裝飾模式指的是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來包裹真實(shí)的...

    chuyao 評(píng)論0 收藏0
  • Java 設(shè)計(jì)模式裝飾模式

    摘要:裝飾者模式組成結(jié)構(gòu)抽象構(gòu)件給出抽象接口或抽象類,以規(guī)范準(zhǔn)備接收附加功能的對(duì)象。裝飾者模式圖解裝飾者模式應(yīng)用場(chǎng)景需要擴(kuò)展一個(gè)類的功能,或給一個(gè)類添加附加職責(zé)。裝飾者對(duì)象接受所有來自客戶端的請(qǐng)求。參考資料設(shè)計(jì)模式 一、了解裝飾者模式 1.1 什么是裝飾者模式 裝飾者模式指的是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾者來包裹真實(shí)的對(duì)...

    kumfo 評(píng)論0 收藏0
  • 前端也要學(xué)系列:設(shè)計(jì)模式裝飾模式

    摘要:什么是裝飾者模式今天我們來講另外一個(gè)非常實(shí)用的設(shè)計(jì)模式裝飾者模式。就增加功能來說,裝飾者模式相比生成子類更為靈活。下面,裝飾者模式就要正式登場(chǎng)了。下一步,我們可以愉快的去使用裝飾者模式啦 什么是裝飾者模式 今天我們來講另外一個(gè)非常實(shí)用的設(shè)計(jì)模式:裝飾者模式。這個(gè)名字聽上去有些莫名其妙,不著急,我們先來記住它的一個(gè)別名:包裝器模式。 我們記著這兩個(gè)名字來開始今天的文章。 首先還是上《設(shè)計(jì)...

    高勝山 評(píng)論0 收藏0
  • php裝飾模式

    裝飾者模式概念 動(dòng)態(tài)地將責(zé)任附加到對(duì)象上,若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案 裝飾者模式結(jié)構(gòu)圖 showImg(https://segmentfault.com/img/bVKmnl?w=1040&h=795); 裝飾者角色 1.被裝飾者基類(Compoent):對(duì)象組件2.待裝飾對(duì)象(ConcreteComponent):具體組件角色,即將要被裝飾增加功能的類3.裝飾者基類(De...

    pf_miles 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<