[设想形式][适配器形式][Javascript]

The Adapter Pattern is a software design pattern that allows the interface of an existing class to be used from another interface. It’s often used to mak existing classes work with others without modifying their source code.
From http://en.wikipedia.org/wiki/Adapter_pattern

定义

适配器形式的目的是转变接口,是将一组接口适配成用户期待的接口。
当援用的外部库的API发作转变的时刻,怎样合适这类转变?怎样转变对象和类的接口,使之能够为如今的体系所兼容,这就是适配器形式的意义。

简朴的来讲,能够经由过程对象传入,然后做托付来完成。然则实在能够在做托付的过程当中做更多的事情来雄厚适配器自身

需求

《[设想形式][适配器形式][Javascript]》

有一个数据模型DataModel,它的泉源多是差别的数据库,MySQL/MongoDB等等。DataModel有一组CURD的接口,来读写数据库。
需求是能够适配差别的数据库来举行数据的读写。

这里扯出来讲一说。在.net内里有一个ADO.NET,就是为数据库的接见供应多个一致的接口和基类就是DataAdapter,用来衔接DataSet与Database。
有兴致能够看一下:http://msdn.microsoft.com/zh-cn/library/h43ks021(v=vs.110).aspx

类图

《[设想形式][适配器形式][Javascript]》

前端的数据库,额,不能说数据库吗,就说能存存东西的处所:LocalStorage和IndexDB。
LocalStorage就不说了,这个比较群众了,twitter还由于LocalStorage爆出过XSS进击的题目

关于IndexDB的学问,UML图没有给的很清晰,参考这里:

这里用LocalStorage来做例子,而且会模仿redis到场一个时间戳,将来能够用来标记是不是数据逾期

适配器形式这里仔细说一下,在传统的完成中,适配器形式有两种完成体式格局:类适配器形式和对象适配器形式

  • 对象适配就是这里给出的例子,在adapter中含有adaptee的实例,然后再挪用
  • 类适配须要继续adaptee和adapter,然后内部做接口适配,这个须要用多继续,不发起在javascript中运用

角色

  • AbstractDataAdapter (Target) 体系顺应的接口组
  • LsDataAdapter (Adapter) 适配器 担任接口转换
  • LsDataAdaptee (Adaptee)

完成

var prototype = require('prototype');

var AbstractDataAdapter = prototype.Class.create({
  create: function(key, data) {
    throw new Error('method must be override!');
  },

  update: function(key, olddata, newdata) {
    throw new Error('method must be override!');
  },

  read: function(key) {
    throw new Error('method must be override!');
  },

  delete: function(key) {
    throw new Error('method must be override!');
  }
});

var LsAdaptee = function () {

  // @todo 模仿推断是nodejs环境照样浏览器环境
  if (require) {
    var info = {};
    return {
      removeItem: function (key) {
        return delete info[key];
      },
      setItem: function (key, data) {
        console.log('setItem --  key:'+key+', data:'+data)
        return info[key] = data
      },
      getItem: function (key) {
        console.log('getItem --  key:'+key+', data:'+info[key])
        return info[key]
      }
    }
  }else{
    return window.localStorage;
  }
}

var LsDataAdapter = prototype.Class.create(AbstractDataAdapter, {

  initialize: function(options) {
    this.adaptee = new LsAdaptee();
  },

  create: function(key, data) {
    var already = this.adaptee.getItem(key);
    if (already) {
      return false;
    }

    if (data) {
      var insert = {
        data: data,
        jointime: Date.now()
      }

      this.adaptee.setItem(key, JSON.stringify(insert));
      return true;
    }else{
      return false;
    }
  },

  update: function(key, olddata, newdata) {
    if (newdata) {
      var insert = {
        data: newdata,
        jointime: Date.now()
      }
    }

    this.adaptee.setItem(key, JSON.stringify(insert));
  },

  read: function(key) {
    var data = this.adaptee.getItem(key);
    if (data) {
      var info = JSON.parse(data);
      return info.data;
    }else{
      return false;
    }
  },

  delete: function(key) {
    this.adaptee.remove(key);
  },

  parse: function(source) {
    // @todo 将datamodel转为viewmodel
    return source;
  }
});

var Model = prototype.Class.create({
  initialize: function(options) {
    this.adapter = options.adapter;
    this.data = {};
  },

  set: function(key, data) {
    this.data[key] = data;
    this.adapter.update(key, null, data);
  },

  get: function(key) {
    return this.data[key] = this.adapter.read(key);
  }
})

var Main = function () {
  var lsDataAdapter = new LsDataAdapter();
  var model = new Model({ adapter: lsDataAdapter});

  model.set('USER_INFO', {TOKEN: 'a627991dd0e5441be9fdd6f88746148a'});
  var data = model.get('USER_INFO', {TOKEN: 'a627991dd0e5441be9fdd6f88746148a'});

  console.log('---------------------------')
  console.log(data);

}

Main();

参考

    原文作者:leewind
    原文地址: https://segmentfault.com/a/1190000000647916
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞