数据访问对象模式(Data access object-DAO):抽象和封装对数据源的访问和存储,DAO通过对数据源链接的管理方便对数据的访问与存储。数据访问对象类DAO,方便管理自己本地存储库。

数据访问对象类是对本地存储的一次封装,基本上是对数据的增删改查操作。
本地存储保存在localstorage中,对于同一个站点,没有分割库,所以要将每次存储的数据字段前面添加前缀表示。

//创建一个DAO类
var BaseLocalStorage = function(preId,timeSign){
    //定义本地存储数据库前缀
    this.preId = preId;
    //定义时间戳与存储数据之间的拼接符
    this.timeSign = timeSign || ‘|-|’;
}

在DAO类内部保存操作返回状态供以后使用,在本地存储服务的引用保存在DAO类的内部,DAO提供对数据库的增删改查操作接口方法。

// 本地存储类原型方法
BaseLocalStorage.prototype = {
    //操作状态
    status : {
        SUCCESS:0,
        FAILURE:1,
        OVERFLOW:2,
        TIMEOUT:3
    },
    //保存本地存储链接
    storage : localStorage || window.localStorage,
    //获取本地存储数据库数据真实字段
    getKey : function(key){
        return this.preId + key;
    },
    //添加修改数据
    set: function(key,value,callback,time){
        //默认操作状态时成功
        var status = this.status.SUCCESS,
        //获取真实字段
            key = this.getKey(key);
        try{
            //参数时间参数时获取时间戳
            time = new Date(time).getTime() || time.getTime();
        }catch(e){
            //为传入时间参数或者时间参数有误获取默认时间:一个月
            time = new Date().getTime() + 1000*60*60*24*31;
        }
        try{
            this.storage.setItem(key,time + this,timeSign + value)
        }catch(e){
            status = this.status.OVERFLOW;
        }
        callback && callback.call(this,status,key,value);
    },
    //获取数据 四种情况
    get: function(key,value){
        var status = this.status.SUCCESS,
            key = this.getKey(key),
            value = null,
            timeSignLen = this.timeSign.length,
            that = this,
            index,
            time,
            result;
        try{
            value = that.storage.getItem(key);
        }catch(e){
            result = {
                status : that.status.FAILURE,
                VALUE : null
            };
            callback && callback.call(this,result.status,result.value);
            return result;
        }
        //如果成功获取数据字符串
        if(value){
            index = value.indexOf(that.timeSign);
            time += value.slice(0,index);
            //如果时间没过期
            if(new Date(time).getTime() > new Date().getTime() || time == 0){
                value = value.slice(index + timeSignLen);
            }else{
                //过期结果为null
                value = null,
                status = that.status.TIMEOUT;
                that.remove(key);
            }
        }else{
            status = that.status.FAILURE;
        }
        //设置结果
        result = {
            status : status,
            value : value
        };
        callback && callback.call(this,result.status,result.value);
        return result;
    },
    //删除数据
    remove: function(key,callback){
        var status = this.status.FAILURE,   
            key = this.getKey(key),
            value = null;
        try{
            value = this.storage.getItem(key);
        }catch(e){}
        if(value){
            try{
                this.storage.removeItem(key);
                status = this.status.SUCCESS;
            }catch(e){}
        }
        callback && callback.call(this,status,status>0?null:value.slice(value.indexOf(this.timeSign) + this.timeSign,length))
    }
}

数据访问对象模式更适合与服务器端的数据库操作,在nodejs中操作MongoDB时即可使用.
数据访问对象模式可以方便我们对前端存储的管理,统一我们的使用方式,并且使用时更加方便。
数据访问对象(DAO)模式即是对数据库的操作(CURD)进行封装,用户不必为操作数据库感到苦恼,DAO提供了简单而统一的操作接口,对于Mongo来说,DAO对象甚至会保留对数据库的链接,每次操作数据库不必一次次向数据库发送链接请求。