亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入理解JavaScript系列(29):設計模式之裝飾者模式詳解

2019-11-20 13:02:08
字體:
來源:轉載
供稿:網友

介紹

裝飾者提供比繼承更有彈性的替代方案。 裝飾者用用于包裝同接口的對象,不僅允許你向方法添加行為,而且還可以將方法設置成原始對象調用(例如裝飾者的構造函數)。

裝飾者用于通過重載方法的形式添加新功能,該模式可以在被裝飾者前面或者后面加上自己的行為以達到特定的目的。

正文

那么裝飾者模式有什么好處呢?前面說了,裝飾者是一種實現繼承的替代方案。當腳本運行時,在子類中增加行為會影響原有類所有的實例,而裝飾者卻不然。取而代之的是它能給不同對象各自添加新行為。如下代碼所示:

復制代碼 代碼如下:

//需要裝飾的類(函數)
function Macbook() {
    this.cost = function () {
        return 1000;
    };
}

function Memory(macbook) {
    this.cost = function () {
        return macbook.cost() + 75;
    };
}

function BlurayDrive(macbook) {
    this.cost = function () {
        return macbook.cost() + 300;
    };
}


function Insurance(macbook) {
    this.cost = function () {
        return macbook.cost() + 250;
    };
}


// 用法
var myMacbook = new Insurance(new BlurayDrive(new Memory(new Macbook())));
console.log(myMacbook.cost());

下面是另一個實例,當我們在裝飾者對象上調用performTask時,它不僅具有一些裝飾者的行為,同時也調用了下層對象的performTask函數。

復制代碼 代碼如下:

function ConcreteClass() {
    this.performTask = function () {
        this.preTask();
        console.log('doing something');
        this.postTask();
    };
}

function AbstractDecorator(decorated) {
    this.performTask = function () {
        decorated.performTask();
    };
}

function ConcreteDecoratorClass(decorated) {
    this.base = AbstractDecorator;
    this.base(decorated);

    decorated.preTask = function () {
        console.log('pre-calling..');
    };

    decorated.postTask = function () {
        console.log('post-calling..');
    };

}

var concrete = new ConcreteClass();
var decorator1 = new ConcreteDecoratorClass(concrete);
var decorator2 = new ConcreteDecoratorClass(decorator1);
decorator2.performTask();

再來一個徹底的例子:

復制代碼 代碼如下:

var tree = {};
tree.decorate = function () {
    console.log('Make sure the tree won/'t fall');
};

tree.getDecorator = function (deco) {
    tree[deco].prototype = this;
    return new tree[deco];
};

tree.RedBalls = function () {
    this.decorate = function () {
        this.RedBalls.prototype.decorate(); // 第7步:先執行原型(這時候是Angel了)的decorate方法
        console.log('Put on some red balls'); // 第8步 再輸出 red
        // 將這2步作為RedBalls的decorate方法
    }
};

tree.BlueBalls = function () {
    this.decorate = function () {
        this.BlueBalls.prototype.decorate(); // 第1步:先執行原型的decorate方法,也就是tree.decorate()
        console.log('Add blue balls'); // 第2步 再輸出blue
        // 將這2步作為BlueBalls的decorate方法
    }
};

tree.Angel = function () {
    this.decorate = function () {
        this.Angel.prototype.decorate(); // 第4步:先執行原型(這時候是BlueBalls了)的decorate方法
        console.log('An angel on the top'); // 第5步 再輸出angel
        // 將這2步作為Angel的decorate方法
    }
};

tree = tree.getDecorator('BlueBalls'); // 第3步:將BlueBalls對象賦給tree,這時候父原型里的getDecorator依然可用
tree = tree.getDecorator('Angel'); // 第6步:將Angel對象賦給tree,這時候父原型的父原型里的getDecorator依然可用
tree = tree.getDecorator('RedBalls'); // 第9步:將RedBalls對象賦給tree

tree.decorate(); // 第10步:執行RedBalls對象的decorate方法

總結

裝飾者模式是為已有功能動態地添加更多功能的一種方式,把每個要裝飾的功能放在單獨的函數里,然后用該函數包裝所要裝飾的已有函數對象,因此,當需要執行特殊行為的時候,調用代碼就可以根據需要有選擇地、按順序地使用裝飾功能來包裝對象。優點是把類(函數)的核心職責和裝飾功能區分開了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久成人精品一区二区三区| 国产精品久久久久久亚洲调教| 精品成人在线视频| 国产欧美精品日韩精品| 色偷偷亚洲男人天堂| 亚洲人成网站999久久久综合| 国产成人在线一区二区| 一本色道久久88综合亚洲精品ⅰ| 久久久久成人精品| 成人性生交xxxxx网站| 国产视频一区在线| 国产精品三级美女白浆呻吟| 亚洲a级在线观看| 91中文字幕在线观看| 日韩精品中文字幕在线观看| 久久久久久亚洲精品不卡| 成人动漫网站在线观看| 中文字幕一区二区精品| 欧美极品少妇xxxxⅹ免费视频| 91精品免费久久久久久久久| 91久久夜色精品国产网站| 国产91露脸中文字幕在线| 国产精品第3页| 国产成人亚洲精品| 亚洲国产欧美精品| 欧美日韩一区二区免费视频| 成人黄色在线免费| 欧美一级黄色网| 亚洲专区国产精品| 亚洲欧美成人一区二区在线电影| 日韩欧美福利视频| 国产精国产精品| 日韩精品在线免费播放| 国产精品欧美日韩| 欧美日韩精品在线观看| 国产成人综合精品| 欧美精品在线免费播放| 萌白酱国产一区二区| 在线观看中文字幕亚洲| 中文字幕一区二区三区电影| 亚洲精品ady| 国产精品视频在线播放| 中文字幕欧美精品在线| 欧美老女人在线视频| 91精品国产沙发| 国产精品久久久久久久久久久新郎| 日韩最新免费不卡| 欧美性极品xxxx做受| 国产欧美精品一区二区三区-老狼| 国产精品偷伦一区二区| 亚洲女人天堂色在线7777| 亚洲第一精品电影| 久久久国产精品亚洲一区| 成人黄色生活片| 国产精品国产亚洲伊人久久| 一本色道久久88亚洲综合88| 国产一区红桃视频| 色系列之999| 日韩美女免费观看| 欧美电影《睫毛膏》| 国产有码在线一区二区视频| 日韩欧美在线视频日韩欧美在线视频| 亚洲欧美制服丝袜| 在线观看国产欧美| 在线免费观看羞羞视频一区二区| 亚洲欧美日韩国产中文| 欧美裸体xxxxx| 欧美福利小视频| 久久久久国产精品一区| 欧美性生交大片免网| 亚洲免费电影在线观看| 高跟丝袜一区二区三区| 中日韩美女免费视频网址在线观看| 高清亚洲成在人网站天堂| 亚洲欧美日韩天堂| 国产精品99蜜臀久久不卡二区| www.亚洲免费视频| 欧美野外wwwxxx| 日韩最新av在线| 韩剧1988免费观看全集| 欧美精品成人91久久久久久久| 欧美日韩精品国产| 日韩有码片在线观看| 亚洲国产精彩中文乱码av在线播放| 久久影视电视剧凤归四时歌| 久久6免费高清热精品| 久久国产精品影视| 亚洲最大的网站| 欧美中文字幕在线| 国产suv精品一区二区三区88区| 亚洲精品视频中文字幕| 在线精品国产欧美| 午夜精品一区二区三区在线播放| 成人福利网站在线观看11| 欧美乱大交做爰xxxⅹ性3| 欧美大片va欧美在线播放| 亚洲综合国产精品| 欧美成人精品xxx| 热99在线视频| 亚洲国产福利在线| 欧美中文字幕在线播放| 日韩电视剧免费观看网站| 欧美片一区二区三区| 亚洲国产高清自拍| 日韩不卡中文字幕| 国产mv久久久| 中文字幕日韩精品在线观看| 福利精品视频在线| 日韩在线观看高清| 亚洲精品一区二区三区不| 91伊人影院在线播放| 在线播放国产精品| 97久久精品在线| 精品一区二区三区三区| 精品美女久久久久久免费| 欧美高清一级大片| 国产一区欧美二区三区| 精品一区二区亚洲| 成人亚洲激情网| 国产精品久久久久77777| 亚洲free性xxxx护士白浆| 亚洲 日韩 国产第一| 91欧美精品成人综合在线观看| 日韩不卡中文字幕| 国产精品国产三级国产专播精品人| 国产一区二区三区精品久久久| 国产精品久久久久7777婷婷| 精品国产区一区二区三区在线观看| 日韩美女视频免费在线观看| 国产精品777| 国产成人中文字幕| 久久99国产精品自在自在app| 88xx成人精品| 久久久国产精彩视频美女艺术照福利| 日韩欧美在线看| 欧美野外wwwxxx| 国产成人精品久久二区二区91| 2019中文字幕全在线观看| 全亚洲最色的网站在线观看| 最近中文字幕mv在线一区二区三区四区| 狠狠躁夜夜躁人人爽超碰91| xxxxx成人.com| 成人黄色影片在线| 成人黄色在线免费| 日韩精品高清在线观看| 成人欧美一区二区三区黑人| 国产精品久在线观看| 2020欧美日韩在线视频| 亚洲美女精品成人在线视频| 亚洲香蕉成人av网站在线观看| 中文字幕日韩欧美| 91高潮精品免费porn| 日韩久久午夜影院| 精品国产福利在线| 欧美一级高清免费播放| 欧美性xxxx极品hd满灌| 亚洲欧美日韩一区在线| 欧美性开放视频| 亚洲男子天堂网| 神马久久桃色视频| 国产精品美乳一区二区免费| 亚洲性av在线| 日韩资源在线观看| 韩国三级电影久久久久久|