裝飾者模式的概念是在物件上動態的加上功能來強化目標,所以在設計時,必須注意要設計的容易被強化。
是透過覆寫的方法來強化功能,所以這樣的做法會比產生子類別更靈活。
function Computer() {
this.price = function() {
return 30000;
};
}
function addMemory(pc) { //Decorator 1 - 增加記憶體需 $1000
var price = pc.price();
pc.price = function() {
return price + 1000;
};
}
function addEngraving(pc) { //Decorator 2 - 增加作業系統 $2000
var price = pc.price();
pc.price = function() {
return price + 2000;
};
}
function addInsurance(pc) { //Decorator 3 - 增加保固需 $3900
var price = pc.price();
pc.price = function() {
return price + 3900;
};
}
var mb = new Computer();
//增加記憶體、刻字、保固
addMemory(mb);
addEngraving(mb);
addInsurance(mb);
console.log(mb.price());// 36900
概念類似生活中我們們會替手機購買相關配件,例如保護貼、包膜、皮套等,目的就是要保護手機外觀不受傷。
優點
缺點
策略模式在可執行時期,依照不同情況選擇不同的策略方式。
基本上使用相同的操作介面,但是可依照不同的程式來運作。
// 資料
var data = {
name: "Reynold",
message: "I am handsome boy!"
};
// 核心物件,利用建構式置入策略
function Sender(strategy) {
this.strategy = strategy;
};
// 核心方法
Sender.prototype.send = function(data) {
return this.strategy.send(data);
};
// 訂定策略
var xmlStrategy = {
send: function(data) {
var str = "<xml><name>" + data.name + "</name><message>" + data.message + "</message></xml>";
return str;
}
};
// 訂定策略
var jsonStrategy = {
send: function(data) {
var str = JSON.stringify(data);
return str;
}
};
var sender = new Sender(xmlStrategy);
var result = sender.send(data);
console.log(result);
生活中通勤有許多策略,例如走路、搭公車、搭捷運、開車、搭計程車等等,因應不同的狀況可以使用不同的策略。
優點
缺點
外觀模式經常在軟體工程中使用,為子系統中的一組介面提供一個統一的高層介面,使得子系統更易用,簡化複雜的操作過程。
var cpu = {
execute: function() {
console.log("execute");
}
};
var memory = {
load: function() {
console.log("load");
}
};
var hdd = {
write: function() {
console.log("write");
}
};
var computer = {
work: function() {
memory.load();
cpu.execute();
hdd.write();
}
};
var user = {
main: function() {
computer.work(1);
computer.work(2);
}
}
user.main();
生活中透過電腦公司買新電腦,只需要告訴他們需求,再由他們幫忙組裝完成。
優點
缺點
今天這的是塞車塞到懷疑人生 XDD,在車上構想鐵人賽,想完了還在塞 囧
參考資料:
Tommy - 深入 JavaScript 核心課程