接口:利 固化一部分代码 弊 丧失js的灵活性

在JavaScript中模仿接口

  1. /*
  2. interface Composite{
  3. function add(child);
  4. function remove(child);
  5. function getChild(index);
  6. }
  7. interface FormItem{
  8. function save();
  9. }
  10. */
  11. var CompositeForm=function(id,method,action){
  12. ...
  13. };
  14. CompositeForm.prototype.add = function(child) {
  15. ...
  16. };
  17. CompositeForm.prototype.remove = function(child) {
  18. ...
  19. };
  20. CompositeForm.prototype.getChild = function(index) {
  21. ...
  22. };
  23. CompositeForm.prototype.save = function() {
  24. ...
  25. };

改进一下,用属性检查

  1. /*
  2. interface Composite{
  3. function add(child);
  4. function remove(child);
  5. function getChild(index);
  6. }
  7. interface FormItem{
  8. function save();
  9. }
  10. */
  11. var CompositeForm=function(id,method,action){
  12. this.implementsInterfaces=['Composite','FormItem'];
  13. ...
  14. };
  15. ...
  16. function addForm(formInstance){
  17. if (!implements(formInstance,'Composite','FormItem')) {
  18. throw new Error("Object does not implement a required interface.");
  19. }
  20. ...
  21. }
  22. function implements(Object){
  23. for(var i=1;i<arguments.length;i++){
  24. var interfaceName=arguments[i];
  25. var interfaceFound=false;
  26. for(var j=0;j<Object.implementsInterfaces.length;j++){
  27. if (Object.implementsInterfaces[j]==interfaceName) {
  28. interfaceFound=true;
  29. break;
  30. };
  31. }
  32. if (!interfaceFound) {
  33. return false;
  34. };
  35. }
  36. return true;
  37. }

用鸭式辨型模仿接口

  1. var Composite =new Interface('Composite',['add','remove','getChild']);
  2. var FormItem=new Interface('FormItem',['save']);
  3. var CompositeForm=function(id,method,action){
  4. ...
  5. };
  6. ...
  7. function addForm(formInstance){
  8. ensureImplements(formInstance,Composite,FormItem);
  9. ...
  10. }

结合第一种和第三种

  1. var Composite =new Interface('Composite',['add','remove','getChild']);
  2. var FormItem=new Interface('FormItem',['save']);
  3. var CompositeForm=function(id,method,action){
  4. ...
  5. };
  6. ...
  7. function addForm(formInstance){
  8. Interface.ensureImplements(formInstance,Composite,FormItem);
  9. ...
  10. }

Interface类的定义

  1. var Interface=function(name,method){
  2. if(arguments.length!=2){
  3. throw new Error("需要2个参数");
  4. }
  5. this.name=name;
  6. this.method=[];
  7. for(var i=0,len=methods.length;i<len;i++){
  8. if(typeof methods[i]=='string'){
  9. throw new Error("需要是一个字符串");
  10. }
  11. this.methods.push(methods[i]);
  12. }
  13. };
  14. Interface.ensureImplements=function(object){
  15. if(arguments.length<2){
  16. throw new Error("至少需要2个参数");
  17. }
  18. for(var i=1,len=arguments.length;i<len;i++){
  19. var interface=arguments[i];
  20. if(interface.constructor!=Interface){
  21. throw new Error("需要2个参数,并是Interface的实例");
  22. }
  23. for(var j=0,methodsLen=interface.methods.length;j<methodsLen;j++){
  24. var method=interface.methods[j];
  25. if (!object[method]||typeof object[method]!=='function') {
  26. throw new Error('方法未找到');
  27. };
  28. }
  29. }
  30. };

javascript设计模式2的更多相关文章

  1. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  2. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  3. Javascript设计模式学习一

    学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...

  4. javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

    在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...

  5. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)

    在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...

  6. javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)

    类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. ...

  7. 常用的Javascript设计模式

    <parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...

  8. Javascript设计模式(摘译)

    说明: 未完成...更新中.... 一.javascipt设计模式分类 设计模式分类有很多标准,最流行的三种如下 1)  creational  --  主要关注对象创建 Creational des ...

  9. JavaScript设计模式学习笔记

    1 JavaScript设计模式深入分析 私有属性和方法:函数有作用域,在函数内用var 关键字声明的变量在外部无法访问,私有属性和方法本质就是你希望在对象外部无法访问的变量. 特权属性和方法:创建属 ...

  10. JavaScript设计模式:读书笔记(未完)

    该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...

随机推荐

  1. 关于window.location不跳转的问题

    今天在码代码的时候遇到个问题:html里采用onclick事件来实现window.location = url的跳转,在内嵌元素上又加上了href="javascrit:;"的属性 ...

  2. iis7以上版本权限控制

    IIS7.5中(仅win7,win2008 SP2,win2008 R2支持),应用程序池的运行帐号,除了指定为LocalService,LocalSystem,NetWorkService这三种基本 ...

  3. 特殊的Python

    在学习python之前,我也学习过C ,C++ ,Java ,PHP ,javascript,前端也学习过.但是在学习Python的这段时间里,多多少少也感觉到Python在语法方面的不同和特殊性. ...

  4. uCOS-II任务的挂起和恢复

    函数描述 OSTaskSuspend() 功能描述:无条件挂起一个任务.调用此函数的任务也可以传递参数OS_PRIO_SELF,挂起调用任务本身.函数原型:INT8U OSTaskSuspend ( ...

  5. poj 2440 (找递推公式)

    http://poj.org/problem?id=2440 DNA Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3254 ...

  6. 求解 s = (1*1)!+(2*2)! + (3*3)!+...+(n*n)! (C语言)

    提示:定义函数可以求阶乘,再定义函数求阶乘之和.1和0的阶乘是1,n(n > 1)的阶乘是n * (n-1) * (n - 2) * … * 1 //采用了函数嵌套调用和函数递归调用 //求解阶 ...

  7. 显示 EXCEL 的页签列表

    如果你的EXCEL表有很多页签,反复点击左右箭头可能会很费时间. 不妨试试在 左箭头 或者 右箭头 上点击 右键,会有页签列表弹出.

  8. Note8 开机提示:secSetupWized 已停止

    情况分析: 1.要么没有双清2.要么是删除了系统内置服务 恢复后的向导 这个如果正常情况下是 弹出 选择所在地区语言/联系方式/系统设置 此情景一般出现在 刷机后/恢复默认出厂设置后. 解决办法: 刷 ...

  9. 服务器监控之 ping 监控

    在运维人员的日常工作中,对物理服务器的监控十分重要.物理机的 CPU.内存.磁盘使用率,网卡流量,磁盘 IO 等都需要进行监控.通过 ICMP 协议的 ping 监控,可以判断物理服务器运行是否正常或 ...

  10. HDU 1176 免费馅饼(DP)

    点我看题目 题意 : 中文题.在直线上接馅饼,能接的最多是多少. 思路 :这个题其实以前做过.....你将这个接馅饼看成一个矩阵,也不能说是一个矩阵,反正就是一个行列俱全的形状,然后秒当行,坐标当列, ...