zoukankan      html  css  js  c++  java
  • javascript设计模式2

    接口:利 固化一部分代码 弊 丧失js的灵活性

    在JavaScript中模仿接口

    /*
    interface Composite{
        function add(child);
        function remove(child);
        function getChild(index);
    }
    interface FormItem{
        function save();
    }
    */
    var CompositeForm=function(id,method,action){
        ...
    };
    CompositeForm.prototype.add = function(child) {
        ...
    };
    CompositeForm.prototype.remove = function(child) {
        ...
    };
    CompositeForm.prototype.getChild = function(index) {
        ...
    };
    CompositeForm.prototype.save = function() {
        ...
    };

    改进一下,用属性检查

    /*
    interface Composite{
        function add(child);
        function remove(child);
        function getChild(index);
    }
    interface FormItem{
        function save();
    }
    */
    var CompositeForm=function(id,method,action){
        this.implementsInterfaces=['Composite','FormItem'];
        ...
    };
    ...
    function addForm(formInstance){
        if (!implements(formInstance,'Composite','FormItem')) {
            throw new Error("Object does not implement a required interface.");
        }
        ...
    }
    function implements(Object){
        for(var i=1;i<arguments.length;i++){
            var interfaceName=arguments[i];
            var interfaceFound=false;
            for(var j=0;j<Object.implementsInterfaces.length;j++){
                if (Object.implementsInterfaces[j]==interfaceName) {
                    interfaceFound=true;
                    break;
                };
            }
            if (!interfaceFound) {
                return false;
            };
        }
        return true;
    }

    用鸭式辨型模仿接口

    var Composite =new Interface('Composite',['add','remove','getChild']);
    var FormItem=new Interface('FormItem',['save']);
    var CompositeForm=function(id,method,action){
        ...
    };
    ...
    function addForm(formInstance){
        ensureImplements(formInstance,Composite,FormItem);
        ...
    }

    结合第一种和第三种

    var Composite =new Interface('Composite',['add','remove','getChild']);
    var FormItem=new Interface('FormItem',['save']);
    var CompositeForm=function(id,method,action){
        ...
    };
    ...
    function addForm(formInstance){
        Interface.ensureImplements(formInstance,Composite,FormItem);
        ...
    }

    Interface类的定义

    var Interface=function(name,method){
        if(arguments.length!=2){
            throw new Error("需要2个参数");
        }
        this.name=name;
        this.method=[];
        for(var i=0,len=methods.length;i<len;i++){
            if(typeof methods[i]=='string'){
                throw new Error("需要是一个字符串");
            }
            this.methods.push(methods[i]);
        }
    };
    Interface.ensureImplements=function(object){
        if(arguments.length<2){
            throw new Error("至少需要2个参数");
        }
        for(var i=1,len=arguments.length;i<len;i++){
            var interface=arguments[i];
            if(interface.constructor!=Interface){
                throw new Error("需要2个参数,并是Interface的实例");
            }
            for(var j=0,methodsLen=interface.methods.length;j<methodsLen;j++){
                var method=interface.methods[j];
                if (!object[method]||typeof object[method]!=='function') {
                    throw new Error('方法未找到');
                };
            }
        }
    };
  • 相关阅读:
    Java实现旅行商问题
    Java实现旅行商问题
    Java实现旅行商问题
    Java实现旅行商问题
    递归执行顺序的探究
    递归执行顺序的探究
    递归执行顺序的探究
    配置我的Ubuntu Server记(包括桌面及VNC,SSH,NTP,NFS服务) good
    罗辑思维 137 藩镇割据:毒药还是良药?(要懂得自我收敛?不要什么事情都自己做?)
    云计算CTO工作的具体内容(挺详细)
  • 原文地址:https://www.cnblogs.com/sdgjytu/p/4201472.html
Copyright © 2011-2022 走看看