js設計模式 --- 接口 (類 對象)

接口

系列內容是對 js設計模式 書的學習消化, 代碼多來子這本書, 或者在此書代碼上的改進,

接口是傳統面向對象最經常使用到的工具, 如java, c++, c#, 接口即規範, 規定了對象應該有哪些名字的屬性和方法, 他只規定這種規範有哪些, 但不具體實現, 具體的類由類來實現, 進而由類建立的對象爲該類的事例, 天然也聽從此規範javascript

面向接口編程在大型的軟件系統中是很是重要的, 接口是對類的抽象畫, 是對類功能需求的規範, 面向接口編程有一些列的有點和缺點, 在這裏不加點評, 總之能夠在須要的地方使用不一樣的技術java

javascript做爲一門表現力極強的語言得益於它的弱類型特色, 接口的使用在必定程度上強化了類型的做用, 下降靈活性, 因此js並無接口功能, 但正由於js靈活, 實現起來並不是難事node

面向對象的接口 類 對象

首先來舉一個例子, 實際生活中開發商(開發別墅)和住戶是開發商建好房子後由住戶觀看戶型來肯定是否購買, 如今咱們反過來定製別墅庫, 用戶根據自身需求來定製本身的別墅c++

下面以下圖來講明接口, 類 對象的關係, 途中客戶只規定本身對於房屋的需求報給開發商, 開發商根據需求能夠謀劃出不一樣的實現了該需求的圖紙, 能夠根據不一樣圖紙來建造房子, 這些房子遵循相同的規範,
圖片描述編程

接口的實現c#

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開發重視
相關文章
相關標籤/搜索