国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[設計模式][適配器模式][Javascript]

genedna / 590人閱讀

摘要:定義適配器模式的目標是改變接口,是將一組接口適配成用戶期待的接口。當引用的外部庫的發生改變的時候,如何適合這種改變如何改變對象和類的接口,使之能夠為現在的系統所兼容,這就是適配器模式的意義。

  

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發生改變的時候,如何適合這種改變?如何改變對象和類的接口,使之能夠為現在的系統所兼容,這就是適配器模式的意義。

簡單的來說,可以通過對象傳入,然后做委托來實現。但是其實可以在做委托的過程中做更多的工作來豐富適配器本身

需求

有一個數據模型DataModel,它的來源可能是不同的數據庫,MySQL/MongoDB等等。DataModel有一組CURD的接口,來讀寫數據庫。
需求是可以適配不同的數據庫來進行數據的讀寫。

這里扯出來說一說。在.net里面有一個ADO.NET,就是為數據庫的訪問提供多個統一的接口和基類就是DataAdapter,用來連接DataSet與Database。
有興趣可以看一下:http://msdn.microsoft.com/zh-cn/library/h43ks021(v=vs.110).aspx

類圖

前端的數據庫,額,不能說數據庫嗎,就說能存存東西的地方:LocalStorage和IndexDB。
LocalStorage就不說了,這個比較大眾了,twitter還因為LocalStorage爆出過XSS攻擊的問題

關于IndexDB的知識,UML圖沒有給的很清楚,參考這里:

https://developer.mozilla.org/zh-CN/docs/IndexedDB

http://code.tutsplus.com/tutorials/working-with-indexeddb--net-34673

這里用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();
參考

http://sourcemaking.com/design_patterns/adapter

http://blog.csdn.net/hguisu/article/details/7527842

http://www.cnblogs.com/Terrylee/archive/2006/02/18/333000.html

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87602.html

相關文章

  • JavaScript 設計模式(四):適配模式

    摘要:與其它模式的異同適配器模式不會改變原有接口,這一點與裝飾者模式和代理模式類似。代理模式適配器模式與代理模式最相似,同樣都是創建一個新對象包裝一次,實現對本體的調用。外觀模式外觀模式與適配器模式最大的區別,是定義了一個新的接口。 showImg(https://segmentfault.com/img/bVbul8d?w=800&h=600); 適配器模式:將一個類(對象)的接口(方法或...

    MingjunYang 評論0 收藏0
  • JavaScript設計模式系列五:配器模式

    摘要:什么是適配器模式所謂適配器模式就是用一個新的接口對現有的接口進行包裝,處理類與的不匹配。對象適配器可以適配它的父對象接口方法或屬性。裝飾者模式增強了對象的功能而同時又不改變它的接口,因此它對程序的透明度比適配器要好。 什么是適配器模式 所謂 適配器模式 就是用一個新的接口對現有的接口進行包裝,處理類與API的不匹配。使用這種模式的對象又叫作包裝器。比如我們有一個接口: function...

    banana_pi 評論0 收藏0
  • 從ES6重新認識JavaScript設計模式(四): 配器模式

    摘要:什么是適配器模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。中的適配器模式在前端項目中,適配器模式的使用場景一般有以下三種情況庫的適配參數的適配和數據的適配。 1 什么是適配器模式 適配器模式(Adapter):將一個類的接口轉換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。 在...

    URLOS 評論0 收藏0
  • JavaScript設計模式配器模式

    摘要:舊接口格式和使用者不兼容,中間加一個適配器轉換接口。模式作用使用一個已經存在的對象,但其方法或接口不符合你的要求。 原文博客地址:https://finget.github.io/2018/11/22/adapter/ 適配器模式 適配器模式(Adapter)是將一個類(對象)的接口(方法或屬性)轉換成客戶希望的另外一個接口(方法或屬性),適配器模式使得原本由于接口不兼容而不能一起工作...

    CNZPH 評論0 收藏0
  • JavaScript 設計模式讀書筆記(七)——配器模式

    摘要:與門面模式的聯系本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。我們以中的一個為例,說說實際應用中的適配器模式的使用方法。而如果實現層的問題不大,要解決一部分適配問題的話,適配器模式就是很好的選擇了。 與門面模式的聯系 本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。它們都對類的接口進行了一些改變。門面模式是把相似的或是完成相關任務的接...

    AZmake 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<