代理模式
定义
提供一个实际对象的代理,以便更好地控制实际对象。在生活中很容易就能找到很多代理的例子,比如明星的经纪人、各种代购等等。
代理模式的关键是,当不方便或不满足条件控制一个对象的访问时,需要提供一个替代对象对请求做一次筛选之后再传给本体。
代理的意义
实现单一职责原则,降低了耦合性。如果未来不再需要额外处理,则可以不需要代理对象,直接使用真实对象调用请求即可,利于维护。
示例
var Person = function() {};
Person.prototype.shopping = function(goods) { // 只关心买什么物品
console.log("buy " + goods + ".")
}
// 代理对象
var PersonProxy = (function() {
return function(person) {
this.person = person;
}
})();
PersonProxy.prototype.shopping = function(goods) {
console.log("do something before you go shopping");
this.person.shopping(goods); // 代替真实对象买物品,并增加预处理和后处理
console.log("do something after you go shopping");
}
var proxyPerson = new PersonProxy(new Person());
proxyPerson.shopping ("apple");
ES6 实现代理模式
class Person {
constructor(name) {
this.name = name;
}
shopping (goods) {
console.log("buy " + goods + ".")
}
};
let p = new Person("xiaoming");
let personProxy = new Proxy(p, {
// 在读取代理对象的某个属性时触发该操作
get: function(target, key, value) {
let val = target[key];
if(typeof val === "function") {
return function(...args) {
console.log("do something before you go shopping");
Reflect.apply(val, target, args); // 反射调用
console.log("do something after you go shopping");
};
} else {
return val;
}
}
});
personProxy.shopping("apple");
总结
虽然代理模式非常有用,但我们在编写业务代码的时候,往往不需要去预先猜测是否需要使用代理模式。当真正发现不方便访问某个对象的时候,再编写代理也不迟。