zoukankan      html  css  js  c++  java
  • 鸭式辨型

    鸭式辨型来自于James Whitecomb Riley的名言:"像鸭子一样走路并且嘎嘎叫的就叫鸭子。"通过制定规则来判定对象是否实现这个接口。

    创建接口类,主要用来保存信息到实例类中

    var Interface = function (name, methods) {
        this.name = name;
        this.method = methods;
    }

     自定义接口,接口中定义了接口名称和一些方法名称。这里创建一个Duck接口,Duck接口中定义了swim, cry, foots方法。说得简单些,接口就是自定义规则。我定义了会游泳,会嘎嘎叫,有两条腿的就是鸭子。

    var Duck = new Interface('Duck', ['swim', 'cry', 'foots'])

    创建检测方法。它用来检测对象中有没有实现Duck接口中所有的方法,如果有就认为这个对象实现了Duck接口;否则就认为没有实现。

    Interface.ensureImplements = function (obj, interface) {
        var canNotFoundMethods = [];    
        for(var i = 0, len = interface.method.length; i < len; i++) {
            //检测对象有没有接口中所有方法
            if(!interface.method[i] || typeof obj[interface.method[i]] !== 'function') {
                canNotFoundMethods.push(interface.method[i]);
            }
        }
        if(canNotFoundMethods.length){
             throw new Error(obj.name+'实例对象没有实现'+interface.name+'接口');
        }else{
            console.log(obj.name+'实例对象已经实现'+interface.name+'接口');
        }
    }

    创建被检测的对象_new_duck。这个对象继承了三个方法。

    var duck = function (){ this.name = 'duck'; }
    duck.prototype = {    
        'swim': function (){},
        'cry': function (){},
        'foots': function (){},
    }
    var _new_duck = new duck();

    最后检测,如果_new_duck中有Duck接口定义的所有方法,那么我们就可以认为_new_duck对象实现了Duck接口。我们前面定义了鸭子是会游泳,会嘎嘎叫,还有两条腿,所有符合这规则定义的就可以称为鸭子。正如_new_duck拥有了Duck接口所有定义的方法。

    Interface.ensureImplements(_new_duck, Duck); 

    总结:

      鸭式辨型理解起来并不困难。实现接口实际上是检测对象是否拥有接口定义的所有方法。接口只是用来定义某些方法名称,它并不需要实现这些方法,比如Duck接口中不需要实现swim方法。接口要做的是记住方法名称。

    Duck.swim();   //Duck接口并不需要实现swim方法
  • 相关阅读:
    numpy 基础 —— np.linalg
    图像旋转后显示不完全
    opencv ---getRotationMatrix2D函数
    PS1--cannot be loaded because the execution of scripts is disabled on this system
    打开jnlp Faild to validate certificate, the application will not be executed.
    BATCH(BAT批处理命令语法)
    oracle vm virtualbox 如何让虚拟机可以上网
    merge 实现
    Windows batch,echo到文件不成功,只打印出ECHO is on.
    python2.7.6 , setuptools pip install, 报错:UnicodeDecodeError:'ascii' codec can't decode byte
  • 原文地址:https://www.cnblogs.com/Songyc/p/4267844.html
Copyright © 2011-2022 走看看