JavaScript 设计模式 装饰器模式
装饰器是 一种为对象添加新特性的技术 ,它并不适用创建新子类的这种手段。装饰器模式可以用来透明的把对象包装在具有同样接口的另一个对象中。这样我们就可以为对象添加一个方法或一些行为,然后将方法调用传递给原始对象
//装饰者模式:就是在保证不改变原有对象的基础上,去扩展一些想要的方法或需求
// 实现同样的借口
// 需要有子类
/*
var CarInterface = new BH.Interface('CarInterface' , ['getPrice' , 'assemble']);
var Car = function(car){
//就是为了让子类继承的 (让子类 多一个父类的引用)
this.car = car ;
//检查接口
BH.Interface.ensureImplements(this , CarInterface);
};
Car.prototype = {
constructor :Car,
getPrice:function(){
return 200000 ;
},
assemble:function(){
document.write('组装汽车...');
}
};
//新的需求:light、icebox .......
var LightDecorator = function(car){ //原始对象
//借用构造函数继承
LightDecorator.superClass.constructor.call(this , car);
};
BH.extend(LightDecorator , Car); //原型继承
LightDecorator.prototype = {
constructor:LightDecorator ,
getPrice:function(){
return this.car.getPrice() + 10000;
},
assemble:function(){
document.write('组装车灯...');
}
};
var IceBoxDecorator = function(car){
//借用构造函数继承
IceBoxDecorator.superClass.constructor.call(this , car);
};
BH.extend(IceBoxDecorator , Car); //原型继承
IceBoxDecorator.prototype = {
constructor:IceBoxDecorator ,
getPrice:function(){
return this.car.getPrice() + 20000;
},
assemble:function(){
document.write('组装车载冰箱...');
}
};
var car = new Car();
alert(car.getPrice());
car.assemble();
car = new LightDecorator(car);
alert(car.getPrice());
car.assemble();
car = new IceBoxDecorator(car);
alert(car.getPrice());
car.assemble();
*/
//装饰者 不仅可以用在类上, 还可以用在函数上
/*
//返回一个当前时间的字符串表示形式
function getDate(){
return (new Date()).toString();
};
// 包装函数 (装饰者函数)
function upperCaseDecorator(fn){
return function(){
return fn.apply(this, arguments).toUpperCase();
}
};
alert(getDate());
var getDecoratorDate = upperCaseDecorator(getDate);
alert(getDecoratorDate());
*/
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论