3

接口

系列内容是对 js设计模式 书的学习消化, 代码多来子这本书, 或者在此书代码上的改进,

接口是传统面向对象最常用到的工具, 如java, c++, c#, 接口即规范, 规定了对象应该有哪些名字的属性和方法, 他只规定这种规范有哪些, 但不具体实现, 具体的类由类来实现, 进而由类创建的对象为该类的事例, 自然也遵从此规范

面向接口编程在大型的软件系统中是非常重要的, 接口是对类的抽象画, 是对类功能需求的规范, 面向接口编程有一些列的有点和缺点, 在这里不加点评, 总之可以在需要的地方使用不同的技术

javascript作为一门表现力极强的语言得益于它的弱类型特点, 接口的使用在一定程度上强化了类型的作用, 降低灵活性, 所以js并没有接口功能, 但正因为js灵活, 实现起来并非难事

面向对象的接口 类 对象

首先来举一个例子, 实际生活中开发商(开发别墅)和住户是开发商建好房子后由住户观看户型来确定是否购买, 现在我们反过来定制别墅库, 用户根据自身需求来定制自己的别墅

下面如下图来说明接口, 类 对象的关系, 途中客户只规定自己对于房屋的需求报给开发商, 开发商根据需求可以谋划出不同的实现了该需求的图纸, 可以根据不同图纸来建造房子, 这些房子遵循相同的规范,
图片描述

接口的实现

    var Interface =(function(){
        // 接口类
        var Interface = function(name,methods){
          if(arguments.length != 2){
            throw new Error("参数数量不对,期望传入两个参数,但是只传入了"+arguments.length+"个参数");
          }
          this.name = name;
          this.methods = [];
          for(var i = 0, len = methods.length; i < len; i++){
            if(typeof methods[i] !== "string"){
              throw new Error("期望传入的方法名是以字符串的格式类型,而不是"+ (typeof methods[i]) + "类型");
            }
            this.methods.push(methods[i]);
          }
        }
        
        // 测试对象是否实现接口方法
        Interface.ensureImplements = function(object){
        
          if(arguments.length < 2){
            throw new Error("期望传入至少两个参数,这里仅传入"+arguments.length+"个参数");
          }
          for(var i = 1; i < arguments.length; i++){
            var interf = arguments[i];
            if(!(interf instanceof Interface)){
              throw new Error(arguments[i] + "不是一个接口");
            }
            for(var j = 0, methodsLen = interf.methods.length; j < methodsLen; j++){
              var method = interf.methods[j];
              if(!object[method] || typeof object[method] !== "function"){
                throw new Error("对象的方法 "+method+" 与接口 "+interf.name+" 定义的不一致");
              }
            }
          }
        }
        return Interface;
    })()    
    //************************************
    //接口
    var Live = new Interface('Live',['eat','speak']);
    var ComPro = new Interface('ComPro',['usb', 'sci', 'spi', 'I2C']);
    
    // 定义一个Robot类实现Live、ComPro接口
    var Robot = function(){
    }; 
    
    Robot.prototype = {
    
      // 实现Live接口
      eat: function(){
        console.log("I can eat");
      },
      speak: function(){
        console.log("I can speak Chinese");
      },
      // 实现ComPro接口
      usb: function () {
        console.log('use usb');
      },
      sci: function () {
        console.log('use sci');
      },
      spi: function () {
        console.log('use spi');
      },
      I2C: function () {
        console.log('use I2C');
      }
    };
    
    var myRobot = new Robot();
    
    function useRobot(robot){
      Interface.ensureImplements(robot, Live, ComPro);
      robot.eat();
      robot.speak();
      robot.spi();
      robot.usb();
    }
接口的作用为类提供规范和限制, 这和 js 灵活性相背离, 但在大型软件开发中, 这种规范可以提高程序的可读性和可拓展性, 恰恰是所推崇的, 随着 node 在后端的兴起, 面向接口编程的思想有必要js开发重视

镰月
313 声望13 粉丝

它的优秀之处并非原创,它的原创之处并不优秀。