JavaScript設計模式-- 代理(Proxy)模式
定義: 用一個物件去做為另一個物件的介面, 這樣做的主目的是為了保護物件的存取, 避免不正確的操作行為。
看到這裡, 不知會不會和迭代器模式混淆呢?
代理模式和迭代器模式都是為了保護目標物件的資料不被更動。但是代理模式能更進一步保護物件的操作流程(因操作具有順序性), 也就是先做什麼才能後做什麼, 這也是因為我們不選擇直接使用目標物件(我們要保護的資料存在這物件中)的方法。
e.g.
var car = { // 這動作有順序性: startEngine --> run --> stopEngine
startEngine: function() { console.log("startEngine"); },
stopEngine: function() { console.log("stopEngine"); },
run: function() { console.log("run"); }
};
function ProxyCar(car) {
var isStarted = false; // 用私有變數封裝, 防止外部修改(形成閉包)
this.startEngine = function() {
if (isStarted) { // 確認是否已有啟動引擎了(因操作具順序性)
console.log("It is already started!");
} else {
car.startEngine();
isStarted = true;
}
};
this.stopEngine = function() {
if (!isStarted) { // 確認是否已有關閉引擎了(因操作具順序性)
console.log("It is already stopped!");
} else {
car.stopEngine();
isStarted = false;
}
};
this.run = function() {
if (!isStarted) { // 確認是否已有啟動引擎了(因操作具順序性)
console.log("You have to start the engine first!");
} else {
car.run();
}
};
}
var proxyCar = new ProxyCar(car); // car本身是物件, 傳到proxy物件去進一步設定、操作其屬性
proxyCar.run(); // You have to start the engine first!
proxyCar.stopEngine(); // It is already stopped!
proxyCar.startEngine(); // startEngine
proxyCar.run(); // run
p.s. 寫介面的code時, 要避免有些東西給外部修改(封裝-->不想被改就變成私有屬性和方法吧)。
看到這裡, 不知會不會和迭代器模式混淆呢?
代理模式和迭代器模式都是為了保護目標物件的資料不被更動。但是代理模式能更進一步保護物件的操作流程(因操作具有順序性), 也就是先做什麼才能後做什麼, 這也是因為我們不選擇直接使用目標物件(我們要保護的資料存在這物件中)的方法。
e.g.
var car = { // 這動作有順序性: startEngine --> run --> stopEngine
startEngine: function() { console.log("startEngine"); },
stopEngine: function() { console.log("stopEngine"); },
run: function() { console.log("run"); }
};
function ProxyCar(car) {
var isStarted = false; // 用私有變數封裝, 防止外部修改(形成閉包)
this.startEngine = function() {
if (isStarted) { // 確認是否已有啟動引擎了(因操作具順序性)
console.log("It is already started!");
} else {
car.startEngine();
isStarted = true;
}
};
this.stopEngine = function() {
if (!isStarted) { // 確認是否已有關閉引擎了(因操作具順序性)
console.log("It is already stopped!");
} else {
car.stopEngine();
isStarted = false;
}
};
this.run = function() {
if (!isStarted) { // 確認是否已有啟動引擎了(因操作具順序性)
console.log("You have to start the engine first!");
} else {
car.run();
}
};
}
var proxyCar = new ProxyCar(car); // car本身是物件, 傳到proxy物件去進一步設定、操作其屬性
proxyCar.run(); // You have to start the engine first!
proxyCar.stopEngine(); // It is already stopped!
proxyCar.startEngine(); // startEngine
proxyCar.run(); // run
p.s. 寫介面的code時, 要避免有些東西給外部修改(封裝-->不想被改就變成私有屬性和方法吧)。
留言
張貼留言