java Script 接口实现 简单实例

来源:互联网 发布:餐饮收银软件多少钱 编辑:程序博客网 时间:2024/05/17 13:11
<!DOCTYPE html><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;i<len;i++){                    if(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;i<len;i++){                        var interfaceName=arguments[i];                        if(interfaceName.constructor !==Interface){                            throw new Error("接口类型不匹配");                        }                        for(var j=0;j<interfaceName.methods.length;j++){                            var 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>
0 0
原创粉丝点击