js29--装饰着模式
//装饰者模式:就是在保证不改变原有对象的基础上,去扩展一些想要的方法或去求
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('组装汽车...');
}
}; var LightDecorator = function(o){ //函数调用的时候执行
//继承属性并传值,this.car = car,此时传进来的car是上面的Car对象。
LightDecorator.superClass.constructor.call(this , o);
/*
相当于复制代码:this.car = car ;
BH.Interface.ensureImplements(this , CarInterface);
*/
};
BH.extend(LightDecorator , Car); //立即执行 LightDecorator.prototype = {
constructor:LightDecorator ,
getPrice:function(){
return this.car.getPrice() + 10000;
},
assemble:function(){
document.write('组装车灯...');
}
}; var IceBoxDecorator = function(o){
//继承属性并传值,this.car = car,此时传进来的car是上面的LightDecorator对象。js没有多态概念,
IceBoxDecorator.superClass.constructor.call(this , o);
};
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(); var L = new LightDecorator(car);
alert(L.getPrice());
L.assemble(); var I = new IceBoxDecorator(L);
alert(I.getPrice());
I.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());
js29--装饰着模式的更多相关文章
- 装饰者模式 Decoration
1.什么是装饰者模式 动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活.当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列 ...
- JAVA装饰者模式(从现实生活角度理解代码原理)
装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...
- 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)
在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...
- 设计模式(九)装饰者模式(Decorator Pattern)
一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...
- PHP 装饰器模式
装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...
- C#设计模式-装饰者模式
在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).Access ...
- Java 的设计模式之一装饰者模式
刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行 ...
- 《Head First 设计模式》之装饰者模式
作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5922248.html 模式名称 装饰者模式(Decorator Pattern) 需求 定义咖啡厅中的 ...
- DecoratorPattern(装饰器模式)
/** * 装饰者模式 * @author TMAC-J * 总的来说,装饰者模式就是继承的应用 */ public class DecoratorPattern { interface Beans{ ...
- 设计模式-装饰器模式(Decrator Model)
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概 ...
随机推荐
- Ehcache学习总结(3)--Ehcache 整合Spring 使用页面、对象缓存
Ehcache 整合Spring 使用页面.对象缓存 Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布式 ...
- COGS——T 21. [HAOI2005] 希望小学
http://www.cogs.pro/cogs/problem/problem.php?pid=21 ★★ 输入文件:hopeschool.in 输出文件:hopeschool.out ...
- ArcGIS api for javascript——图形-选择一个范围内的点
描述 本例展示了如何使用图形显示查询结果,如何使用draw toolbar在地图上选择图形和如何修改图形符号为“高亮”. 在地图上画一个矩形区域,加亮矩形范围内的城市.这个应用统计高亮的城市个数并列出 ...
- ArcGIS api for javascript——图层-创建定制的切片图层类型的图层
描述 本例展示了如何创建一个定制图层,该图层访问来自WEB服务器的地图切片.这种方式最通用的用途是检索ArcGIS Server 9.2切片缓存或web上的其他地图切片服务.尽管本例使用的是一个Arc ...
- [Poi] Use Markdown as React Components by Adding a Webpack Loader to Poi
Poi ships with many webpack loaders included, but you may run into scenarios where you'll need to cu ...
- 智课雅思词汇---六、fer是什么意思
智课雅思词汇---六.fer是什么意思 一.总结 一句话总结:词根:fer = to carry(拿), to bring(带来), to bear(负担, 1.equ是什么意思? 词根:-equ- ...
- BZOJ 3629 约数和定理+搜索
呃呃 看到了这道题 没有任何思路-- 百度了一发题解 说要用约数和定理 就查了一发 http://baike.so.com/doc/7207502-7432191.html (不会的可以先学习一下) ...
- 《Linux企业应用案例精解》一书已由清华大学出版社出版
<Linux企业应用案例精解>简介 650) this.width=650;" border="0" alt="223754878.jpg" ...
- 数据库更新DATE类型的时间
使用to_date() 进行格式转换 to_date('2018/11/16','yyyy/MM/dd') update tableName t set t.shipment_date = to_da ...
- Activiti工作流(3):activiti核心API
ProcessEngine 说明: 1) 在Activiti中最核心的类,其他的类都是由他而来. 2) 产生方式:ProcessEngine defaultProcessEngine = Pr ...