javascript设计模式——同步模块模式

模块化:将复杂的系统分解成高内聚、低耦合的模块,使系统开发变得可控、可维护、可扩展,提高模块的复用率

//模块管理器单体对象

//定义模块管理器单体对象
    var F = F || {};

    /***
    *@param str 模块路由
    *@param fn 模块方法
    **/

    F.define = function(str , fn){
        //解析路由
        var parts = str.split(".");
            //当前模块的祖父模块,parent当前模块父模块
            old = parent = this;
            //i 模块层级,len 模块层级长度
            i = len = 0;
        if(parts.length > 0){

            //如果第一个模块是模块管理器单体对象,则移除
            if(parts[0] === "F"){
                parts = parts.slice(1);
            }

            //屏蔽对define与module模块方法的重写
            if(parts[0] === "define" || parts[0] === "module"){
                return ;
            }

            //遍历路由模块并定义每层模块
            for(var i  = 0 ; i < parts.length ; i++){
                if(typeof parent[parts[i]] === "undefined"){
                    parent[parts[i]] = {};
                }
                old = parent;
                parent = parent[parts[i]];
            }

            //如果给定模块方法则定义该模块方法
            if(fn){
                old[parts[--i]] = fn(); 
            }
            return this;
        }
    };

    F.define("say.hello",function(){
        return function(str){
            console.log(str);
        }
    });


    //模块调用方法
    F.module = function(){
        //将参数转化为数组
        var args = [].slice.call(arguments);
            //获取执行函数
            fn = args.pop();
            //获取模块依赖,如果args[0] 是数组,则依赖模块为args[0],否则依赖模块为args
            parts = args[0] && args[0] instanceof Array ? args[0]:args;
            //依赖模块列表
            modules = [];
            //模块路由
            modIDs = '';
            i = 0 ;
            //依赖模块长度
            ilen = parts.length;
        while(i < ilen){
            //解析模块路由,并屏蔽模块父对象
            modIDs = parts[i].replace(/^F\./,'').split(".");
            parent = this;
            for(var j = 0 ; j < modIDs.length ; j++){
                parent = parent[modIDs[j]] || false;
            }
            //将模块添加到依赖模块列表中
            modules.push(parent);
            i++;
        }
        //构造函数执行环境
        fn.apply(null,modules);
    }

    F.module(['say.hello'],function(say){
        say("say Hello");
    });

你可能感兴趣的:(javascript设计模式——同步模块模式)