1、面向对象模式装饰者
<!DOCTYPE html>
<html lang="en"><head> <meta charset="UTF-8"> <title>面向对象—Decorator装饰者模式</title> <script type="text/javascript"> //给实例对象(注:不影响类)动态添加职责的方式叫做Decorator装饰者模式,较继承,此方法更为灵活。 //先声明一个原始飞机类 var Plane = function(){}; Plane.prototype.fire = function(){ console.log('发射子弹'); } //接下来声明两个装饰类,他们之间靠this所指向的实例对象连接 var MissleDecorator = function(plane){//发射导弹装饰类 this.plane = plane; } MissleDecorator.prototype.fire = function(){ this.plane.fire(); console.log('发射导弹'); } var AtomDecorator = function(plane){//发射原子弹装饰类 this.plane = plane; } AtomDecorator.prototype.fire = function(){ this.plane.fire(); console.log('发射原子弹'); } //测试用例 var plane = new Plane(); plane = new MissleDecorator(plane);//技巧在于这里的实例传参,起到纽带作用 plane = new AtomDecorator(plane); plane.fire(); //本例已经通过验证 </script></head><body></body></html>
2、函数式编程实现装饰者效果——其实是职责链模式
<!DOCTYPE html>
<html><head> <meta charset="utf-8"></meta> <title>函数式编程实现装饰者效果——其实是职责链模式</title></head><body></body><script type="text/javascript"> var plane = { //声明单体对象plane fire:function(){ console.log('发射子弹'); } } var missleDecortor = function(){ //声明“发射导弹”功能函数 console.log('发射导弹'); } var atomDecortor = function(){ //声明“发射原子弹”功能函数 console.log('发射原子弹'); } //缓存原plane对象的fire模块 var fire1 = plane.fire; //重写,拓展plane.fire plane.fire = function(){ fire1(); missleDecortor(); //拓展发射导弹功能 } //再次缓存,再次重写 var fire2 = plane.fire; plane.fire = function(){ fire2(); atomDecortor(); } plane.fire();</script></html>