JavaScript设计模式之代理模式

代理模式

定义

  提供一个实际对象的代理,以便更好地控制实际对象。在生活中很容易就能找到很多代理的例子,比如明星的经纪人、各种代购等等。
  代理模式的关键是,当不方便或不满足条件控制一个对象的访问时,需要提供一个替代对象对请求做一次筛选之后再传给本体。

代理的意义

  实现单一职责原则,降低了耦合性。如果未来不再需要额外处理,则可以不需要代理对象,直接使用真实对象调用请求即可,利于维护。

示例

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");

总结

  虽然代理模式非常有用,但我们在编写业务代码的时候,往往不需要去预先猜测是否需要使用代理模式。当真正发现不方便访问某个对象的时候,再编写代理也不迟。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值