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方法
  • 相关阅读:
    QFramework 使用指南 2020(二):下载与版本介绍
    QFramework 使用指南 2020 (一): 概述
    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践
    Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
    Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform
    Unity 游戏框架搭建 2017 (二十二) 简易引用计数器
    Unity 游戏框架搭建 2017 (二十一) 使用对象池时的一些细节
    你确定你会写 Dockerfile 吗?
    小白学 Python 爬虫(8):网页基础
    老司机大型车祸现场
  • 原文地址:https://www.cnblogs.com/Songyc/p/4267844.html
Copyright © 2011-2022 走看看