[設計模式] javascript 之 享元模式;

來源:互聯網
上載者:User

[設計模式] javascript 之 享元模式;
定義:用於解決一個系統大量細粒度對象的共用問題: 關健詞:分離跟共用; 說明: 享元模式分單純(共用)享元模式,以及組合(不共用)享元模式,有共用跟不共用之分;單純享元模式,只包含共用的狀態,可共用狀態是不可變,不可修改的,這是享元的內部狀態;當然有外部狀態就有外部狀態,外部狀態是可變的,不被共用,這個外部狀態由用戶端來管理,是可變化的;外部狀態與內部狀態是獨立分開的,外部狀態一般作為參數傳入享元對象內,但不會影響內部狀態的值;外部狀態,一用用於擷取共用的享元對象,或多或少與內部狀態有點關聯;比如從使用者資料表中擷取資料,傳入一個外部變數使用者名稱,再根據這個使用者名稱,擷取該使用者所有對象狀態資訊; 組合享元模式,配置組合模式來使用,共用部分只做個葉子節點,而組合部分是不必共用的,因為共組部分的子分葉節點元素已經被緩衝,組合部分相當一個分組分類的作用; 享元模式一般會與原廠模式相結合使用,用於管理緩衝的建立跟維護,享元共用元素的建立一般在工廠類裡建立; 享元模式主要用於對象的共用,使具有相似對象,或對象間具有太多相似細粒度的狀態,能共用已經建立的對象,減少對象的建立,減少對記憶體的佔用,提升最佳化效能;      像第一張的情況,就可以使用享元模式,因為後兩排的狀態組合,可能在實體對應中,多次存在,這時就可以使用享元的共用特性,來減少對象的建立,如有相同的狀態或組合,就可以擷取緩衝的狀態,減少對象重複建立,減少記憶體佔用; 執行個體情境: 1>. 系統各種角色許可權分配; 2>. 系統出現很多種狀態,或組合狀態需要對應的,而且這種對應,可以發生很多種其他類型對象上面的,就可以使用享元模式; 執行個體源碼: 單純(共用)享元  1. 自訂的 JavaScript Hashtable: function Hashtable() {    this.values = [];} Hashtable.prototype.getJson = function() {  return this.values;} Hashtable.prototype.add = function(key, value) {    if (!this.contain(key)) {        this.values.push({key:key, value:value});    }} Hashtable.prototype.contain = function(key) {    for (idx in this.values) {        var json = this.values[idx];        if (json.key == key) {            return true;        }    }    return false;} Hashtable.prototype.get = function(key) {    var result;    for (idx in this.values) {        var json = this.values[idx];        if (json.key == key) {            result = json;            break;        }    }    return result;} Hashtable.prototype.delete = function(key) {    for (idx in this.values) {        var json = this.values[idx];        if (json.key == key) {            delete this.values[idx];            break;        }    }} Hashtable.prototype.set = function(key, value) {    if (this.contain(key)) {        this.delete(key);        this.values.push({key:key,value:value});    }}  2. 享元方法:  function Flyweight(one) {    this.stateOne = one;} Flyweight.prototype.operate = function(){   var date = new Date();    console.log(this.stateOne + '-' + Math.random());}; 這裡可以處理傳進來的參數的一些邏輯,也可以初始化從資料庫裡提取資料緩衝儲存; 3. 享元工廠: function FlyweightFactory(){    var hash = new Hashtable();} FlyweightFactory.prototype.getFlyweight = function(state) {    var flyweight;    if (hash.contain(state)) {        flyweight = hash.get(state);    } else {        flyweight = new Flyweight(state);        hash.add(state, flyweight);    }    return flyweight;} 4. Client 使用:  //Client  var factory = new FlyweightFactory();var fly1, fly2, fly3; fly1 = factory.getFlyweight('AABB');fly2 = factory.getFlyweight('CCDD');fly3 = factory.getFlyweight('CCDD'); fly1.operate();fly2.operate(); 輸出: AABB-0.8621504916809499 CCDD-0.7498800195753574 CCDD-0.7498800195753574 複合享元模式 1. 複合享元 function UnShareFlyweight() {    this.state = '';    this.hash = new Hashtable();} UnShareFlyweight.prototype.add = function(key, flyweight) {    this.hash.add(key, flyweight);} UnShareFlyweight.prototype.operate = function(state) {    var flag = false;   /*    for (idx in this.hash) {        var fly = this.list[idx];        if (fly.stateOne == state) {            flag = true;        break;        }    }   */     flag = this.hash.contain(state);    flag ? console.log('Exists') : console.log('Not Exists');} 5. 在修改添加在享元工廠的組合方法:  function FlyweightFactory(){    var hash = new Hashtable();} FlyweightFactory.prototype.getFlyweight = function(state) {    var flyweight;    if (hash.contain(state)) {        flyweight = hash.get(state);    } else {        flyweight = new Flyweight(state);        hash.add(state, flyweight);    }    return flyweight;} FlyweightFactory.prototype.getComposite = function(list) {    var unFly = new UnShareFlyweight();    var flyweight, state;    for (idx in list) {        state = list[idx];        flyweight = this.getFlyweight(state);        unFly.add(state, flyweight);    }} FlyweightFactory.prototype.print = function() {    var jsons = this.hash.getJson();    for (json in jsons) {        json.value.operate();    }}  3. Client 使用: var states = ['AABB', 'CDCD', 'AABB', 'CCDD']; var factory = new FlyweightFactory();factory.getComposite(states); factory.print();輸出:  AABB-0.8749617566354573 CDCD-0.6991151459515095 CCDD-0.9891050879377872 享元模式其他說明  總體來說,享元模式用於減少對象的重複建立,用於減少記憶體使用量,提升效能的結構型模式: 它涉及三個模式:享元模式,原廠模式,組合模式; 對於處理多對多對應而產生的一些資料緩衝儲存,是一個不錯的選擇!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.