JavaScript重构(七):重用老代码

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-02 04:09 点击:

在Java中,有这样一段老代码:
Java代码 
class Round{  
  public void drawRound(); //画圆  

 
现在新代码希望能和它共存,使用一个Person的对象来控制,只不过,可能drawRound,也可能drawRect啊:
Java代码 
class Rect{  
  public void drawRect(); //画方  

 
好,废话少说,我先想到了Adapter模式:
Java代码 
interface Drawable{  
  public void draw();  
}  
 
public class RoundAdapter implements Drawable{  
  private Round round;  
  public void draw(){  
    round.drawRound();  
  }  
}  
 
public class RectAdapter implements Drawable{  
  private Rect rect;  
  public void draw(){  
    rect.drawRect();  
  }  

 
然后,我再引入一个Person对象,就能搞定这一切了:
Java代码 
class Person{  
  private Drawable adapter;  
  public Person(Drawable adapter){  
    this.adapter = adapter;  
  }  
  public void draw(){  
    this.adapter.draw();  
  }  
}  
 
  Drawable rou = new RoundAdapter();  
  Drawable rec = new RectAdapter();  
  new Person(rou).draw(); //画圆 
  new Person(rec).draw(); //画方 
 
想必到此已经让你烦了,一个Adapter模式的最简单例子。再多看一看,这个模式的核心是什么?接口!对,正是例子中的Drawable接口——正是在接口的规约和领导下,我们才能让画圆和画方都变得那么听话。
 
现在JavaScript中,也有这样一段老代码:
Java代码 
function Round(){  
  this.drawRound = function(){  
    alert("round");  
  }  

 
我也想依葫芦画瓢,但是JavaScript没有接口了,怎么办?
……
接口的作用是什么?是对类的行为的规约,可是JavaScript的行为是动态的,无法用简单纯粹的接口来实现、来约束,即便模拟出这样一个接口(参见《JavaScript Design Pattern》),在此又有必要使用它么?强行做出一个接口来,这不是和JavaScript的初衷相违背了吗?
再回到这个问题上面,我原本希望Person的对象可以调用一个统一的draw方法,只是在通过构造Person对象的时候,传入一个不同实现的Drawable对象,做出了不同约束下的实现。
那么,JavaScript中,不仅仅方法的调用者可以作为一个参数传入,方法本身也可以作为参数传入(即所谓方法闭包),这样,所有变化点都控制在这个参数之中,不也实现了我想要的接口规约的效果吗:
Java代码 
function Rect(){  
  this.drawRect = function(){  
    alert("rect");  
  }  
}  
 
function Person(obj){  
//obj参数的格式:{doWhat,who}  
  for(var i in obj){  
    this.doWhat = i;  
    this.who = obj[i];  
    break;  
  }  
  this.draw = function(){  
    this.who[this.doWhat].call(this.who);  
  };  
}  
 
var rou = { drawRound : new Round() };  
var rec = { drawRect : new Rect() };  
(new Person(rou)).draw();  
(new Person(rec)).draw(); 
 
 
写到这里,我觉得很开心:
在Java中,通过接口的规约和适

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Gb2312转utf-8编码的方法(vbs+js)
    • 如何使用Ajax技术开发Web应用程序(1)
    • js跳转路径问题
    • JavaScript模仿桌面窗口
    • 用js检测两个线段是否相交
    • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
    • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
    • 我是如何去了解jquery的(六),案例之幻灯片轮换
    • Jquery封装幻灯片效果
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1