java Script 接口实现 简单实例


<html>
    <head>
        <meta charset="UTF-8">
        <title>title>
    head>
    <body>

    body>
    <script>
        //创建接口:注释描述接口/属性检测接口/鸭式辨型接口
        (function() {
            //注释描述接口实例   就是玩的文档游戏
            /*
             interface Composite(){
                function add(arg);
                function remove(arg);
                function update(arg);
             }
             */
            //CompositeImpl implements Composite
            //使用注释写一段伪码描述
            var CompositeImpl = function() {} //为了避免每次实例化类  该类中所实现的接口方法频繁实例化  需要将方法实例添加在该类的原型对象中
                //此处将this作为返回值   是为了实现链式调用
            CompositeImpl.prototype = {
                    add: function(arg) {
                        console.info("接口中add方法被实现" + arg);
                        return this;
                    },
                    remove: function(arg) {
                        console.info("接口中remove方法被实现" + arg);
                        return this;
                    },
                    update: function(arg) {
                        console.info("接口中update方法被实现" + arg);
                        return this;
                    }
                }
                //实例化当前类调用被实现的方法
            var compositeImpl = new CompositeImpl();
            //compositeImpl.add("add").remove("remove").update("update");
        })();

        (function() {
            //属性检测接口     就是扯淡  没有做到对方法的检测
            //以文档的形式定义两个接口
            /*
              interface Composite(){
                function add(arg);
                function remove(arg);
                function update(arg);
             }
             interface FormIte(){
                function select();
             }
             * */
            //CompositeImpl implements Composite,FormIte
            var CompositeImpl = function() {
                //需要在当前类的内部创建一个变量 用于存储当前类实现了那些接口  是一种规范
                this.implementsInterface = ["Composite", "FormIte"];
            }
            CompositeImpl.prototype = {
                    add: function(arg) {
                        console.info("接口中add方法被实现");
                        return this;
                    },
                    remove: function(arg) {
                        console.info("接口中remove方法被实现");
                        return this;
                    },
                    update: function(arg) {
                        console.info("接口中update方法被实现");
                        return this;
                    },
                    select: function() {
                        console.info("接口中select方法被实现");
                        return this;
                    }
                }
                //检查当前实例的类中是否实现了继承接口中全部的方法
            function CheckCompositeImpl(intance) {
                if(!IsImplements(intance,"Composite", "FormIte")) {
                    throw new Error("当前类中没有实现全部的方法");
                }
            }
            //创建一个公用具体的检测方法
            function IsImplements(arg) {
                for(var i = 1; i < arguments.length; i++) {
                    var interfaceName = arguments[i],
                        interfaceFound = false;
                    for(var j = 0; j < arg.implementsInterface.length; j++) {

                        if(arg.implementsInterface[j] == interfaceName) {
                            interfaceFound = true;
                            break;
                        };

                    }
                    if(!interfaceFound) {
                        return false;
                    }
                }
                return true;
            }

            var compositeImpl = new CompositeImpl();
            CheckCompositeImpl(compositeImpl);
            //compositeImpl.add();
        })();
        (function(){
            //鸭式辨型实现接口(据说是最完美的) 核心是对方法的检查
            //核心:一个类实现接口的动机就是实现接口中全部的方法  否则不叫实现
            //1定义一个接口基类  让它实例化N多个接口 需要的的参数是  接口的名字  和 存储接口中方法名的数组
            var Interface=function(name,methods ){
                //1.判断实参的个数
                if(arguments.length !=2){
                    throw new Error("参数不够");
                }
                this.name=name;
                this.methods=[];
                for(var i=0,len=methods.length;iif(typeof methods[i] !=="string"){
                        throw new Error("方法名必须是String类型");
                    }
                    this.methods.push(methods[i]);
                }
            }
            Interface.ensureImplements=function(object){
                    if(arguments.length<2){
                        throw new Error("参数个数不够")
                    }
                    for(var i=1,len=arguments.length;ivar interfaceName=arguments[i];
                        if(interfaceName.constructor !==Interface){
                            throw new Error("接口类型不匹配");
                        }
                        for(var j=0;jvar methodName=interfaceName.methods[j];
                            if(! object[methodName] || typeof object[methodName] !== "function"){
                                throw new Error("方法不存在");
                            }
                        }
                    }
                }
            var CompositeInterface=new Interface("CompositeInterface",["add","remove"]);
            var FormInterface=new Interface("FormInterface",["update","select"]);
                //2. CompositeImpl impelments  CompositeInterface , FormInterface
                var CompositeImpl=function(){};
                CompositeImpl.prototype={
                    add:function(){
                        console.info("add");
                    },
                    remove:function(){
                        console.info("remove");
                    },
                    update:function(){
                        console.info("update");
                    },
                    select:function(){
                        console.info("select");
                    }
                }
                var compositeImpl=new CompositeImpl();
                Interface.ensureImplements(compositeImpl,CompositeInterface,FormInterface);
            compositeImpl.add();

        })()
    script>

html>

你可能感兴趣的:(javaScript)