资讯专栏INFORMATION COLUMN

Javascript 设计模式读书笔记(一)——接口

zhunjiee / 2448人阅读

摘要:具体检查方式则是检查对象是否实现了接口所声明的所有方法。组合模式将对象群体与组成对象同等对待。装饰者模式透明地为另一对象提供包装,实现相同的接口。

Javascript 中模仿接口的三种方法 1. 注释描述
/*

interface Composite {
  function add(child);
  function remove(child);
  function getChild(index);
}

interface FormItem {
  function save();
}

 */

var CompositeForm = function(id, method, action) { // 定义接口类
  ...
};

// 为接口类添加方法
CompositeForm.prototype.add = function(child) {
  ...
};
CompositeForm.prototype.remove = function(child) {
  ...
};
CompositeForm.prototype.getChild = function(index) {
  ...
};

CompositeForm.prototype.save = function() {
  ...
};

此种方法不易规范遵守,属于程序文档范畴,对接口的约定遵守全靠自觉。但是易于实现,不需额外的类或函数。

2. 属性检查
/*

interface Composite {
  function add(child);
  function remove(child);
  function getChild(index);
}

interface FormItem {
  function save();
}

 */

var CompositeForm = function(id, method, action) {
  this.implementsInterfaces = ["Composite", "FormItem"];
  ...
};

...

function addForm(formInstance) {
  if (!implements(formInstance, "Composite", "FormItem")) {
    throw new Error("Object does not implement a required interface.");
  }
  ...
}

// 检查一个对象是否实现了需要的接口
function implements(object) {
  for (var i = 1; i < arguments.length; i++) {
    var interfaceName = arguments[i];
    var interfaceFound = false;
    for (var j = 0; j < object.implementsInterfaces.length; j++) {
      if (object.implementsInterfaces[j] == interfaceName) {
        interfaceFound = true;
        break;
      }
    }
    if (!interfaceFound) {
      return false; // 未找到接口
    }
  }
  return true; // 所有接口都找到了
}

此方法的优点是对类实现的接口提供了文档说明,如果需要的接口未实现则会报错。缺点在于不能保证类是否真正实现了接口,只知道它是否说自己实现了接口,即使代码未将接口实现也能通过检查,这将在代码中留下隐患。

3. 鸭式辨型

鸭式辨型的意思就是,如果对象具有与接口定义的方法同名的所有方法,那么就认为它实现了这个接口。

// Interfaces

var Composite = new Interface("Composite", ["add", "remove", "getChild"]);
var FormItem = new Interface("FormItem", ["save"]);

// CompositeForm class

var CompositeForm = function(id, method, action) {
  ...
};

...

function addForm(formInstance) {
  // 如果需要的方法未实现则报错
  ensureImplements(formInstance, Composite, FormItem);
  ...
}

ensureImplements函数至少接受两个参数,一个是需要检查的对象,其余为针对此对象需要检查是否实现的接口。具体检查方式则是检查对象是否实现了接口所声明的所有方法。

此方法的缺点是缺乏其他两种方法的自我描述性,需要一个辅助类Interface和一个辅助函数ensureImplements。并且它只关心方法名称而不检查参数名称、数目、类型等。

Interface

综合第一及第三种接口实现方式,Interface类的定义可以为:

// Constructor

var Interface = function(name, methods) {
  if (arguments.length != 2) {
    throw new Error("Interface constructor called with " + arguments.length +
      " arguments, but expected exactly 2.");
  }

  this.name = name;
  this.methods = [];
  for (var i = 0, len = methods.length; i < len; i++) {
    if (typeof methods[i] !== "string") {
      throw new Error("Interface constructor expects method names to be " +
        " passed in as a string");
    }
    this.methods.push(methods[i]);
  }
};

// Static class method

Interface.ensureImplements = function(object) {
  if (arguments.length < 2) {
    throw new Error("Function Interface.ensureImplements called with " +
      arguments.length + " arguments, but expected at least 2.");
  }

  for (var i = 1, len = arguments.length; i < len; i++) {
    var interface = arguments[i];
    if (interface.constructor !== Interface) {
      throw new Error("Function Interface.ensureImplements expects arguments" +
        "two and above to be instances of Interface.");
    }

    for (var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
      var methods = interface.methods[j];
      if (!object[method] || typeof object[method] !== "function") {
        throw new Error("Function Interface.ensureImplements: object " +
          "does not implement the " + interface.name +
          " interface. Method " + method + " was not found.");
      }
    }
  }
};
依赖接口的设计模式

以下的设计模式依赖接口
1. 工厂模式 保证生产出来的对象实现了必须的方法。
2. 组合模式 将对象群体与组成对象同等对待。
3. 装饰者模式 透明地为另一对象提供包装,实现相同的接口。
4. 命令模式 所有的命令对象都实现了同一批方法。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87513.html

相关文章

  • 001-读书笔记-JavaScript高级程序设计 JavaScript简介

    摘要:由于计算机的国际化,组织的标准牵涉到很多其他国家,因此组织决定改名表明其国际性。规范由万维网联盟制定。级标准级标准是不存在的,级一般指的是最初支持的。 这篇笔记的内容对应的是《JavaScript高级程序设计(第三版)》中的第一章。 1.ECMA 和 ECMA-262 ECMA 是欧洲计算机制造商协会的缩写,全程是 European Computer Manufacturers Ass...

    masturbator 评论0 收藏0
  • JavaScript 设计模式读书笔记(七)——适配器模式

    摘要:与门面模式的联系本文要说的适配器模式和上一篇门面模式在思想上有相似之处,所以放在一起说。我们以中的一个为例,说说实际应用中的适配器模式的使用方法。而如果实现层的问题不大,要解决一部分适配问题的话,适配器模式就是很好的选择了。 与门面模式的联系 本文要说的适配器模式和上一篇门面模式在思想上有相似之处,所以放在一起说。它们都对类的接口进行了一些改变。门面模式是把相似的或是完成相关任务的接...

    AZmake 评论0 收藏0
  • Javascript 设计模式读书笔记(二)——封装,简单的创建对象模式

    摘要:创建对象中,创建对象的基本模式有三种。因此,在设计构造函数时,需要进行慎重考虑。因此在中,这种问题被称作继承破坏封装。静态成员每个只有一份,直接通过类对象进行访问。 什么是封装 找工作时一些公司给了offer后我就想知道真正拿到手的是多少,毕竟赋税繁重。但各种税也好,五险一金也好我实在是弄不清楚,于是我就会在网上的一些税后收入计算器上进行计算,只需要填写一些基本信息,比如税前收入,所...

    lentrue 评论0 收藏0
  • JavaScript 设计模式读书笔记(六)——门面模式

    摘要:简单的门面模式实例事件绑定函数门面模式的作用是将复杂的接口进行包装,变成一个便于使用的接口。还是以事件相关为例,事件绑定中还有两个常用的分别是和。 门面模式是什么,与其我去用笨拙的语言去解释,不如看下面这张图,曾经在网上很火的一张图片,说的是一位儿子为他的爸妈设置的电脑桌面。 showImg(http://segmentfault.com/img/bVcgHm); 有了这些起好名字...

    pubdreamcc 评论0 收藏0
  • JavaScript 设计模式读书笔记(五)——工厂模式

    摘要:假设有一个生产交通工具的工厂类,它包含生成多种交通工具实例的方法。在使用这个类生产对象的时候,传入参数,在参数中的属性规定我们需要的类型,构造函数就能够返回我们需要的对象类型了。 一般来说,创建对象的时候我们都习惯使用new关键字来调用constructor构造函数,但使用这种方式会有一些缺点,首先构造器函数的创建本身就是为了模仿其他一些面向对象语言的特性,有些人觉得这是non-sen...

    Eirunye 评论0 收藏0

发表评论

0条评论

zhunjiee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<