欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

設計模式中結構型模式(六)享元模式(Facade)

系統 1741 0

運用共享技術有效地支持大量細粒度的對象。

FlyWeight是一個共享對象,它可以同時在多個場景(context)中使用,并且在每個場景中flyweight都可以作為一個獨立的對象——這一點與非共享的實例沒有區別。flyweight不能對它所運行的場景做出任何假充,這里的關鍵概念是內部狀態和外部狀態之間的區別是。內部狀態存儲于flyweight中,它包含了獨立于flyweight場景的信息,這些信息使得flyweight可以被共享。而外部狀態取決于flyweight場景,并根據場景變化,因此不可共享。用戶對象負責在必要的時候將外部狀態傳遞給flyweight.

Flyweight模式對那些通常因為數量太大而難以用對象來表示的概念或實體進行建模。例如,文檔編輯器可以為字母表中的每一個字母創建一個flyweight.

Flyweight模式的有效性很大程度上取決于如何使用它以及在何處使用它。當以下情況都成立時使用Flyweight:
1、一個應用程序使用了大量的對象。

2、完全由于使用大量的對象,造成很大的存儲開銷。

3、對象的大多數狀態都可變為外部狀態。

4、如果刪除對象的外部狀態,那么可以用相對較少的共享對象取代很多組對象。

5、應用程序不依賴于對象標識。由于Flyweight對象可以被共享,對于概念上明顯有別的對象,標識測試將返回真值。

存儲節約由以下幾個因素決定:

1、因為共享,實例總數減少的數目。

2、對象內部狀態的平均數目。

3、外部狀態是計算的還是存儲的。

共享的Flyweight越多,存儲節約也就越多。節約量隨著共享狀態的增多而增大。當對象使用大量的內部及外部狀態,并且外部狀態是計算出來的而非存儲的時候,節約量將達到最大。所以人,可以用兩種方法來節約存儲:用共享減少內部狀態的消耗,用計算時間換取對外部狀態的存儲。

Flyweight模式經常和Composite模式結合起來表示一個層次式結構,這一層次式結構是一個共享葉節點的圖。共享的結果是,Flyweight的葉節點不能存儲指向父節點的指針。而父節點的指針將傳給Flyweight作為它的外部狀態的一部分。這對于該層次結構中對象之間相互通訊的方式將產生很大的影響。

示例代碼(以后補齊)

// Flyweight.h:interfacefortheFlyweightclass.
//
/**/ ///////////////////////////////////////////////////////////////////// /

#pragma once

class Glyph
... {
public :
virtual ~ Glyph();
virtual void Draw(Window * ,GlyphContext & );

virtual void SetFont(Font * ,GlyphContext & );
virtual Font * GetFont(GlyphContext & );
virtual void First(GlyphContext & );
virtual void Next(GlyphContext & );
virtual bool IsDone(GlyphContext & );
virtual Glyph * Current(GlyphContext & );

virtual void Insert(Glyph * ,GlyphContext & );
virtual void Remove(GlyphContext & );
protected :
Glyph();
}
;

/**/ /* ***********************************************************************
為了避免給每一個Glyph的字體屬性都分配存儲空間,我們可以將該屬性外部存儲于
GlyphContext對象中。GlyphContext是一個外部狀態的存儲庫,它維持Glyph與字體
(以及其它一些可能的圖形屬性)之間的一種簡單映射關系。對于任何操作,如果它
需要知道在給定場景下Glyph字體,都會有一個GlyphContext實例作為參數傳遞給它。
然后,該操作就可以查詢GlyphContext以獲取該場景中的字體信息了。這個場景取決
于Glyphp結構中的Glyph的位置。因此,當使用Glyph時,Glyph子類的迭代和管理操作
必須更新GlyphContext.
***********************************************************************
*/

class GlyphContext
... {
public :
GlyphContext();
virtual ~ GlyphContext();

virtual void Next( int step = 1 );
virtual void Insert( int quantity = 1 );

virtual Font * GetFont();
virtual void SetFont(Font * , int span = 1 );

private :
int _index;
BTree
* _fonts;
}
;

/**/ /* ***********************************************************************
flyweight是我們需要的一個對象,它負責創建Glyph并確保對它們進行合理共享。
GlyphFactory類將實例化Character和其它類型的Glyph.我們只共享Character對象
組合的Glyph要少得多,并且它們的重要狀態(如,它們的子節點)必定是內部的。
***********************************************************************
*/

const int NCHARCODES = 128 ;
class GlyphFactory
... {
public :
GlyphFactory();
virtual ~ GlyphFactory();
virtual Character * CreateCharacter( char );
virtual Row * CreateRow();
virtual Column * CreateColumn();

private :
Character
* _character[NCHARCODES];
}
;

// _character數組包含一些指針,指向以字母代碼為索引的CharacterGlyph。該數組
// 在構造函數中被初始化為零。
GlyphFactory::GlyphFactory()
... {
for ( int i = 0 ;i < NCHARCODES; ++ i)
... {
_character[i]
= 0 ;
}

}


// CreateCharacter在字母符號數組中查找一個字符,如果存在的話,返回相應的Glyph。若
// 不存在,CreateCharacter就創建一個Glyph,將其放入數組中,并返回它:
Character * GlyphFactory::CreateCharacter( char c)
... {
if ( ! _character[c])
... {
_character[c]
= new Character(c);
}

return _character[c];
}


// 其它操作僅需在每次被調用時實例化一個新對象,因為非字符的Glyph不能被共享
Row * GlyphFactory::CreateRow()
... {
return new Row;
}


Column
* GlyphFactory::CreateColumn()
... {
return new Column;
}

設計模式中結構型模式(六)享元模式(Facade)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产sm主人调教女m视频 | 亚洲一区二区中文字幕 | 精品一卡2卡三卡四卡二卡 欧美不卡一区二区三区在线观看 | 美女扒开内裤让男人桶 | 国产毛片视频 | 国产欧美视频一区二区三区 | 日本在线亚州精品视频在线 | 免费小视频 | 国产小视频免费在线观看 | 精品国产一级毛片大全 | 亚洲精选一区 | 黄色免费av | 婷婷激情综合色五月久久竹菊影视 | 丝袜天堂| 91精品国产爱久久久久 | 成熟人妻AV无码专区A片 | 68久久久久欧美精品观看 | 欧洲伊人网 | 免费一级毛片不卡不收费 | 舔操 | 国产日韩综合 | 一区二区三区欧美在线 | 国产无线乱码一区二三区 | 国产欧美精品一区二区 | 一区二区三区高清在线观看 | 99亚洲| 亚洲人成免费网站 | 国产自产拍精品视频免费看 | 美女视频一区 | 国产视频大全 | 99精品国产福利在线观看 | 亚洲日本三级 | 免费午夜理论不卡 | 中文字幕a∨在线乱码免费看 | 成人黄色免费在线观看 | 国产91在线 | 欧美 | 亚洲日韩中文字幕一区 | 免费激情视频在线观看 | 欧美久在线观看在线观看 | 久久久久亚洲精品 | 成人免费观看www视频 |