?Σ(Intent)
Pɺʙ̦Σ*ȫЪ7(fine-grained)Κʓƌ
(Motivation)
̤ɺʯ7Κʓ5̽ˉƊʼնΣ(naive)ԎʾDЖΣƌPʷȫɍΣʓ٨ԎʾPɺʓ(text formatting)ɕ٨D(editing facilities)֭\"ƌΚʓذCʓ٨ئ4IPɺΚʓτɇΣɅ0ʷτɕӿLƊʼ8nΚʓτʓ8Σ4ʹɅƏGPʷʯɺ$ж,֊ƌʹɅɕɇˠɅ0ʯݜգɕ:4ΣԓƌΣ*ёΣʹɅ\"lÅ̵5DƌɺΣΚʓ֭@ʓΣԎƌӿ
Σ;ДɭƊGP8ȫ7ΣʓD6ʹɅΚʓƊ;D`ɕDa̵M͇ΣƌնЪ\"ʷʙɺΚʓDPɺ7ΣΚʓl;ȫΣɭƌ
4նЪΚʓ(Flyweight)4ʙ̦ΚʓʣPɺʯD5ƊնЪΚʓʯ45ȜN4ʅΚʓƏ<Ռ8ʙ̦ΣΚʓΣˇƌնЪΚʓΈ< ؿʾΣ5ƌ۰ΣѝYɇʯΛ(intrinsic)ՌɞΛ(extrinsic)ΣɍƌɇʯΛ¨ʺʯնЪΚʓƏ̵Ռ5ʅΣʪPʙ̦ΣƌɞΛ̠̩5ʪΈʙ̦ΣƌPɺԬΚʓΣRAsmɞΛնЪΚʓƌ
նЪΚʓ֭ѝYɭע(entity)ɭȞΚʓτҼ;ΣƌPʷʓ٨ئ=4ʹɲʅ4նЪΚʓƊ4նЪΚʓ¨ʺ4ʹɅך(character code)Əʼ<ʯʓ8Σԓwɕ̵ʹL(typographic type)ʯAʮʹɅʂɽʓXԱΈ(text layuot algorithms)ɕ
(formatting commands)ΣͩƌʹɅךɇʯΛƊ̵<ΣɞΣƌ٨Ȟʓ84ΣʹɅ4Κʓτ'Ȝӿ
ԎȞ4ʹɅ4ʙ̦ΣնЪΚʓƊ̠ʯ8ʣΣ5ʂʯʓ8Ɗ4ΣʹɅΚʓʣ4նЪΚʓʙ̦(shared pool)8ʣ4ΚʓԎP'Ȝӿ
ıĮĮĴĬĭĮĴĬĭıĮįįıĮıĭıĮijıĮıĮ įįıĭij Ĭ ĭĮįİıIJijĴĵijįĮĮ
ΚʓΣˇʷȜӿƌTGlyphӿLΚʓΣgˇƊ̵8̤նЪΚʓƌ̩٦ɞΛΣؿʾɪl ɞΛsʾ֧m<ƌPʷDraw()ɕIntersects()ʯ<ȰʾcɪlΧҺTGlyph5=ƌ
įıĭĮĭijijĭijıIJijIJĭĮĭijĭĮĭijijĮııijııĭijıIJijIJĭĮĭijĭĮĭijijĮĴĬĭıĭĮĭijijĭijıIJijIJĭįĮĭijĭĮĭijijıĭ 4նЪΚʓτ4ʹɲ”a”¨ʺԓΣʹɅךl¨ʺ̵w(location)ʹL(font)ƊPɺԬPնЪΚʓݜգɭȺ5
ıĭĮĭijijĭijıIJijIJĭĮĭijĭĮĭijijƌPʷ4TRowΧҺ̵ȭʯ<ݜգ̵ɭʪ<ɥXʜ(tiled horizontally)ʪʯݜգmȭΣwƌ
ʪ=8ʣʹɅΣ֧Ъˁʓ8ΣʹɅƊʪΚʓΣڲ֧ЪˁcնΣԎʾΣƌ4ʓ8ʣʹLɕܧΣʹɅw100ʹɅΚʓASCIIʹɅлΣڲ֧lʓΣ`ƌʣʪ=ȫɍʓ8nPɺ̽hӂ1008ʣʹLɕܧ\"CƊ֧ЪʯԎȞȤ8nƌʪ4ΚʓgʂˇʹɅϕ=ƌ
ɺ(Applicability)
PɺնЪΣ5̩٦ʷPɺɕPɺ<ƊԎʾնЪΚʓɪl˷ʘCȜʜʓ'
4ɺPɺȫЪΚʓƌ
¨ʺɭԲʪ=ΚʓΣ֧Ъƌ
ȫɍΣΚʓɞգa(be made extrinsic)ƌ
DΚʓɞΛGԓɍʙ̦Κʓͅƌ ɺl̩٦Κʓ٫½(identity)Ɗʪ=նЪΚʓʙ̦ƏѝYȞ
8ʣΚʓʯ٫½](identity test)mʫƌ
(Structure)
ijIJijijĮıijijĭijIJijIJijĭıIJĴijIJijĭijIJĭijıijijĮįĮĮĮijıIJĴijijĭĭij ijįıijĮĭĭijıĭIJijij ĮĭıijijĭijıĭIJijijĭIJıĮĭıijijijijįıijĮĭĭijıĭIJijij įıijĮĭĭijıĭIJijij
ȜʜΚʓӿʂնЪΚʓʷʙ̦'
ijijĮıijijĮı ĭijĭijijįĮĮĮĭıijijĮĭıijijĭijıĭIJijijĮĭıijijĮĭıijijĭijıĭIJijijՌί(Participants)
TFlyweight(Glyph)
ǓҬɽH49նЪΚʓʯɞΛM͇ɕʾɺƌ TConcreteFlyweight(Character)
ǓԎʾնЪΚʓ9̠ȗɇΛ¨ʺʷΣƌ 4
TConcreteFlyweightɪlʙ̦ƊA̵¨ʺΣΛɪlɇʯΣƏGɪlՌ5ʅΣƌ TUnsharedConcreteFlyweight(Row,Column)
Ǔ̠8ΣնЪΚʓʙ̦ƊնЪΚʓ9ʙ̦Σʼ
̠8ʷƊ4ITUnsharedConcreteFlyweightΚʓʯնЪΚʓˇ8̤(level)TConcreteFlyweightʾ=ȭʷRowɕColumnTConcreteFlyweightʾ=ȭƌ TFlyweightFactory
Ǔ̠ԭնЪΚʓƌ
ǓזϙնЪΚʓɱזΣʙ̦Ɗs4PɺԬ4նЪΚʓ
TFlyweightFactoryP4ʺΣΚʓԎPʺΣc4ƌ TClientPɺԬ
ǓԾް4̽նЪΚʓΣƌ
ǓԱ(computes)¨ʺնЪΚʓΣɞΛƌ2001/1/29
Cʾ(Collaborations)
նЪΚʓ̸֧ΣΛɪlʾ=ɇʯɞƊɇʯΛ8¨ʺ
ʯնЪΚʓƊɞΛɪlɽPɺԬΚʓ¨ʺԱƏPɺԬs^նЪΚʓΣؿʾmΛնЪΚʓƌ PɺԬ8ΦMʅ̴նЪΚʓΣԎPƊPɺԬ5նЪΚʓɪl7
նЪΚʓȰ։ΚʓȲזϙsΣʙɺնЪΚʓƌ
(consequences)
նЪDذɭ´,Ƌ̐ԱɞΛƏ̵sͽ̤¨ʺʯɇΛ'ʷ̤ɽv]в̪¨ƏʙɺΣDΣնЪΚʓ5̽ΣvDƌ¨ʺ]вDʪ0'
ʪʙɺˁΣΚʓԎPڲ֧Ъƌ 4ΚʓɇʯΛΣڲ֧ƌ ɞΛˑԱ¨ʺƌ
DΣնЪΚʓʙɺcvΣ]вDƌv]в¥ίʙɺ5Λ֧Ъƌv]вD̪sΚʓPɺɇʯɕɞΛΣԎ֧ЪƏsɞΛɽԱ5̪Σa¨ʺƌʿQv]в'ʙɺˁɇʯΛΣɭɕ ɞΛԱвƌ
նЪ4ICC(Composite)ʂ4̵ӿL8ʙɺv³(leaf nodes)Əʙ̦ΣնЪΚʓv³Έ¨ʺCٗv³Σ֫ƌԓΣٗv³֫mնЪΚʓʾ=ɞΛƊ4ΣÅʯ8ΣΚʓʷՌ̵ΣΚʓpƌ
Ԏʾ(Implementation)
ԎʾնЪΚʓȜʜ¿ܨ' 1. ɞΛ'ΣɺͩˑϕͩɞΛɕ7ʙɺΚв8Ɗʷ8ʣΣɞΛՌʙɺcΣΚʓ֧Ъ4ɞ
Λˍˁ¨ʺ]вɭƊȞɞΛ74ΚʓԱ5̽ˁ¨ʺΣƌ
ʯʓ٨Pȭ8ƏM¨ʺ4ʹLԓ(map)48a¨ʺʯʹɅΚʓ8ƊԓôPɺʙɺΣʹLޚƊs4ʹɅݜգɭƏ5̽ʹLޚʷʣݜգΣʾɺ(side-effect of the draw traversal)ƌʪ=ʓ4IPɺ̽;֧Σ8ʣʹLɕƊ ̤¨ʺɞ¨ʺɇʯ̙ƌ
2. ԭʙɺΚʓ' ʪ=ΚʓʙɺƊPɺԬ8ΦMΚʓƌնЪΚʓȰ
։PɺԬͩնЪΚʓƊնЪΚʓȰ։4IPɺ4\"C¨ʺ
(associative store)PɺԬΣնЪΚʓƌPʷʯʓ٨8Ծް4նЪΚʓʹɅ1τƊԭί̩ػʹɅךmʫɱזΣնЪΚʓƊʷԓΣΚʓc4mʫƌ
ʙɺʣȤԎʾ4̤Σ֧ɕ͓˧ʫDƊsնЪΚʓ8ʚȼʫ`]вƌsʷնЪΚʓΣ֧Ъ͒ͩΣ;ȞQί8ɪΣPʷASCIIʹɅΣնЪΚʓƏնЪΚʓ
Ծ8Σƌ
P(Sample Code)
ʓPȭƏMͩ4TGlyphնЪӿLΚʓΣˇƊ٨ȞӿLTGlyphCطӿLޚ̠ݜգ̵ɭƊʯMϳʯȭޚƏʼɺTGlyphΣ̵ӿLޚƌ
type
TGlyphContext = class;
TGlyPh = class protected
constructor Create; virtual; public
destructor Destroy; virtual;
procedure Draw(aWindow: TForm; aGlyphContext: TGlyphContext); virtual;
procedure SetFont(aFont: TFont; aGlyphContext: TGlyphContext); virtual;
function GetFont(aGlyphContext: TGlyphContext): TFont; virtual;
procedure First(aGlyphContext: TGlyphContext); virtual; procedure Next(aGlyphContext: TGlyphContext); virtual;
function IsDone(aGlyphContext: TGlyphContext): Boolean; virtual; function Current(aGlyphContext: TGlyphContext): TGlyph; virtual;
procedure Insert(aGlyph: TGlyph; aGlyphContext: TGlyphContext); virtual;
procedure Remove(aGlyphContext: TGlyphContext); virtual; end;
ˇTCharacter¨ʺ4ʹɅ'
TCharacter = class(TGlyPh) private
F_Charcode: Char; public
constructor Create(C: Char); overload;
procedure Draw(aWindow: TForm; aGlyphContext: TGlyphContext); virtual; end;
=۩FTGlyphPɺ]в¨ʺʹLޚƏM ̤ޚʯɞΣTGlyphContextΚʓ8ƊTGlyphContextɞΛΣ¨ʺƏGTGlyphContextԾް4ԻΣTGlyphՌʹLɕ̵ӿLޚƏʷΣʯ8ʣ5ȜΣԓbƌʯͩ5ȜAؿʾΧҺTGlyphΣʹLɽTGlyphContextΚʓԎP֧mƌʪؿʾʯ4ͩ5ȜҬɽCTGlyphContext%ʹLƌ5c̩TGlyphʯglyph8ΣwƏʪTGlyphΣȭˇsPɺ̤ؿʾɪl̙ёTGlyphContextΚʓƌ
TGlyphContext = class private
F_index: word; F_font: TBTree; public
constructor Create;
destructor Destroy; virtual;
procedure Next(step: word = 1); virtual; procedure Insert(step: word = 1); virtual;
function GetFont(): TFont; virtual;
procedure SetFont(aFont: TFont; span: word = 1); virtual; end;
TGlyphContextɪlʯӂ(traversal)8ÃΧ?cʯTGlyph8ΣwƊTGlyphContext.NextʯÃΣӂ8F_indexƌTGlyphΣȭˇTRowɕTColumnʯӂ8ΣA4³ɪlԎʾNext͍TGlyphContext.Nextƌ
TGlyphContext.GetFontPɺ۰iȗBTreeƏBTree¨ʺTGlyphՌʹLΣԓƌBTreeΣ4v³=4ͩʹL֫ʂϳʹΣ`ƏBTreeΣv³C4ʹLƏBTreeɇv³av³=4ȭʹ¿f'[ÃʣʹL4ȭʹɍʹƌ
P20284,ΣvٷƏ̵BTreeʹLD̪ʷȜӿ'
¿f'ɇv³ɇȺ֧ʹτʹ֧ƏԓP202ɇȺ֧ʹ
ĬIJĬIJijĬIJĬĮĮĴıı ɇv³ͩTglyph1(indices)ΣƏBTree¥ϳʹLN¥ϳTGlyph78NƌPʷʷMʯ11026ʹɅexpect=Times-Italic12N=Times12Ɗ̵ʷȜ'
Var
gc: TGlyphContext;
times12, timesItalic12: TFont; begin
gc := TGlyphContext.Create; times12 := TFont.Create;
times12.Name := 'Times New Roman'; times12.Style := fsBold; times12.Size := 12; //.....
gc.SetFont(times12, 6); end;
ёΣBTreecNʷȜӿʂ'ʷʂ ĬIJĬIJĬĮĮĴııMʚdon’t4]ʹL=Times-Italic12ʯexpectȺcƏךʷȜ
var
gc: TGlyphContext;
times12, timesItalic12: TFont; begin
gc := TGlyphContext.Create; timesItalic12 := TFont.Create;
timesItalic12.Name := 'Times New Roman'; timesItalic12.Style := [fsItalic]; timesItalic12.Size := 12; //....
gc.Insert(6);
gc.SetFont(timesItalic12,6); end;
ёΣBTreecNʷȜӿʂ'ʷʂ ĬIJĬIJijĬIJĬĮĮĴıı s?cΣTGlyphCTGlyphContext%ʹLƏTGlyphContextCBTreeƊTGlyphContext^1Φ̽̐̽?cTGlyph1CΣʹƌʪ=ʹL,Σ¦Ԏʯ8ƏBTreeΣȫ7ԓTGlyphȫ77ΣƌPɺ`ΣɭW;Ȥɮв(look-up time)ƌf'вʯ(schema)ȜՌ,PƊQΣΛsʹʹPɺ8ʣΣʹƊʼʯԎȞ;ɹΣƌ
4ΚʓbΣFlyweihgtFactoryնЪΚʓȰ։ƏTflyweihgt- FactoryTGlyph̠זϙ̵ʙɺƊTGlyphFactoryˇTCharacterΚʓɕ̵ӿLΚʓƊMʙ̦TCharacterΚʓƊCӿLΚʓ(composite Glyphs)̠8ɺΣ(plentiful)ƊʣΣΛP'ȭɇʯΣƌ
interface
const
NCHARCODES= 128; Type
TGlypaFactory = class private
f_character: array[1..NCHARCODES] of TCharacter; public
constructor Create;
destructor Destroy; virtual;
function CreaterCharacter(C: Char): TCharacter; virtual; function CreateRow(): TRow; virtual; function CreateColumn(): TColumn; virtual; //...... end;
f_character4¨ʺCTCharacterΣ̩֫ػʹɅך1Ɗʯ̸֧TGlypaFactory.Create8σͤ:=0ƌ
constructor TGlyphFactory.Create; var i: word; begin
for i :=0 to NCHARCODES-1 do f_character[i] := 0; //.... end;
TGlyphFactory.CreaterCharacter(C: Char)ʯf_character84ʹɅƊʷʺʯcmʫԓΣTGlyphƏʷ8ʺʯΣcTGlyphƏʺȗf_character8Ə̠mʫƌ
function TGlyphFactory.CreaterCharacter(C: Char): TCharacter; var
i, j: word; isExist: Boolean; begin
isExist := false;
for i := 0 to NCHARCODES - 1 do begin
if f_character[i].F_Charcode = c then begin
isExist := true;
j := i; Exit; end else
if f_character[i] = nil then begin j := i; Exit; end; end;
if not isExist then
f_character[j] := TCharacter.Create(c); Result := f_character[j]; //.... end;
̵Σ̸֧Ȥɹ4ΚʓƌaTCharacterΚʓcʙ̦ƌ
function TGlyphFactory.CreateRow(): TRow; begin
Result := TRow.Create; //.... end;
function TGlyphFactory.CreateColumn(): TColumn; begin
Result := TColumn.Create; //.... end;
MȤȞQ̸֧ɽPɺԬΦM̤aʙ̦ΣΚʓƌʷƏʷM̤ͩ TGlyphΚʓʙ̦ΣƏMɪlNPɺԬΣPɺΣ̸֧ƌ¿f'ɪlۺ̤ TGlyphΚʓΣ̸֧
:ҬPɺΣPȭ(Known uses)
ΣѝYσɽInterViews3.0^а̪'Σаίɺʅ45Σʓ<ئԨ=DocƊDocPɺGlyphΚʓʂʓ8ΣʹɅƌPɺԬ=4ͩޚ(style)ӿLޚʹɅʅ4GlyphԎPƊʪ4ʹɅΚʓɇʯΛˠʹɅɕޚޚτΣ1ƌf'ʯcΣP8ޚɞΣƊʹɅɇʯΣ@GwɞʯΣƊ
DocxʾΣ̙̈\\ƌʓcDocumentˇτƊDocumentʣȤնЪΚʓȰ։ƌҬЇDocʙ̦նЪΚʓa,Σƌʯ4IΛȜ180000ʹɅ480ʹɅնЪΚʓƌ
ET++PɺնЪΚʓ*(look-and-feel indepndence)f'gȰ։4look-and-feel indepndenceƌlook-and-feel indepndenceLʂPɺԬ9ɅʓԨ=Ȱ̴(Widget)ʷJCƋЬɕ̵|ʷƋmcƌ̤Ʌʓ ̵ݜգȰʾ͝4LayoutΚʓƊNLayoutΚʓNfɕ¿ƏMʯȤƌ
4Ȱ̴ˇ4ԓΣLayoutˇƏ4ܨPɺΣLayoutΚʓ֧Ъ QPɺԬ9Ʌʓ֧Ъ'ʪ=4PɺԬ9Ʌʓ4ܦɞΣLayoutΚʓƌ=۩FƏΣLayoutΚʓԎʾնЪΚʓƌLayout4s8ٳΣնЪΚʓƊʪ=ͩ=Ə̠Hm4̤ݜգȰ̴Κʓ7ΣɞΛƌ
LayoutΚʓɽLookΚʓʅɕԭƊLookΚʓ4gȰ։ƊGetButtonLayOut()ƋGetMenuBarLayout()̸֧ͩͅȰ̴Κʓƌ4look-and-feel֫ѱ4ԓΣLookˇ*ԓΣLayoutΚʓƌ
ɞLayoutΚʓɪΣ(Strategy)Ɗ4ΚʓնЪԎʾƌ
(Related Patterns)
նЪ4IՌCCԎʾKΣƏȤ4ΦMaL(directed-acyclic)ʙɺ³ӿLƌ
4IնЪԎʾΛ(State)ɕ(Strategy)Κʓƌ2001/2/22
http://home.kimo.com.tw/areca_chen/
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务