您好,欢迎来到测品娱乐。
搜索
您的当前位置:首页Flyweight

Flyweight

来源:测品娱乐
նЪ󰀃󰀄(Flyweight)

?Σ(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֋Å̵󰀨5󰃃Dƌ󰁡󰀖ɺ󰃼󰀃ΣΚʓ󰀑󰁮󰀠󰂆֭@󰂠ʓΣԎ󰁰󰀑󰁮ƌ󰀩󰁲󰀵󰂠󰀥󰁴ӿ󰃾

󰃏󰁣Σ󰀏󰀕󰂀󰃜󰀥;󰀌Д󰀘ɭƊGP󰀥8󰀤ȫ7Σ󰂠ʓ󰀠D󰁼󰀰6󰀼󰁎ʹɅΚʓƊ󰃩󰁁󰀌;D`󰂃󰂄ɕ󰀠Da󰀘󰁣󰁪̵󰂈󰂆M͇Σ󰂅󰂌ƌնЪ󰁣󰃜\"󰂘ʷ󰂟ʙɺΚʓ󰃩D󰂨Pɺ󰀏7ΣΚʓ󰃩󰃮l󰂮󰂵;ȫΣ󰀘ɭƌ

4󰁎նЪΚʓ(Flyweight)󰀥4󰁎ʙ̦Κʓ󰀠󰂆ʣ󰀚PɺʯD󰂔󰃊5ƊնЪΚʓʯ󰁅4󰁎󰃊5ȜN󰂙4󰁎󰂚ʅΚʓƏ<Ռ8󰀠ʙ̦ΣΚʓ󰀂󰂌󰀈󰀎󰂡Σ󰀛ˇƌնЪΚʓ󰃮Έ󰀭󰀏< ؿʾΣ󰃊5ƌ󰂨۰ΣѝY󰀥ɇʯΛ󰂭(intrinsic)Ռɞ󰂓Λ󰂭(extrinsic)Σ󰀛ɍƌɇʯΛ󰂭¨ʺʯնЪΚʓƏ̵󰂱󰂂󰀥Ռ󰃊5󰂚ʅΣʪ󰁡P󰀠󰂆ʙ̦Σƌɞ󰂓Λ󰂭󰀥󰀠󰂴󰃟̠󰂛̩󰂩󰃊5ʪ󰁡󰀥󰃮Έʙ̦ΣƌPɺԬΚʓΣRA󰀥s󰁼󰀰󰀚m󰂿ɞ󰂓Λ󰂭󰃚նЪΚʓƌ

նЪΚʓ֭󰃜ѝY󰃠ɭע(entity)󰃃ɭȞ󰂆ΚʓτҼ󰀥;܎󰃇ΣƌPʷ󰂠ʓ󰀴٨ئ󰀠󰂆=󰁅4󰁎ʹɲ󰀙ʅ4󰁎նЪΚʓƊ󰁅4󰁎նЪΚʓ¨ʺ4󰁎ʹɅך(character code)Əʼ󰀥<ʯ󰂠ʓ8Σ󰂛ԓ󰀥wɕ̵ʹL(typographic type)󰀠󰂆ʯA󰂟ʮ󰂀ʹɅ󰂡ʂ󰀚ɽ󰂠ʓ󰀴X󰂙ԱΈ(text layuot algorithms)ɕ󰂶󰃜󰃓󰁒

(formatting commands)󰂌󰂔Σ󰁘ͩƌʹɅך󰀥ɇʯΛ󰂭Ɗ󰃩̵<Σ󰂱󰂂󰀥ɞ󰂓Σƌ󰃗٨Ȟ󰂠ʓ8󰁅4󰁎󰂵󰁫ΣʹɅ󰂌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ΧҺTGlyph󰃊5=󰂟ƌ

󰀍󰀏󰀆󰀄į󰀑󰀙󰀛ı󰀈󰀅󰀃󰀇ĭ󰀋󰀐Įĭij󰀑󰀎ij󰀗󰀙󰀁ĭij󰀑ıIJ󰀑󰀆ijIJ󰀃󰀇ĭ󰀋󰀊Į󰀇ĭij󰀌󰀋󰀇ĭ󰀋󰀐Įĭij󰀑󰀎ij󰀗󰀚󰀍󰀅Į󰀉󰀎󰀆󰀋󰀒󰀋󰀆󰀂󰀈ı󰀍󰀈󰀑󰀄ı󰀄󰀁ij󰀉ı󰀙󰀛ı󰀈󰀅󰀃󰀗󰀙󰀁ĭij󰀑ıIJ󰀑󰀆ijIJ󰀃󰀇ĭ󰀋󰀊Į󰀇ĭij󰀌󰀋󰀇ĭ󰀋󰀐Įĭij󰀑󰀎ij󰀗󰀍󰀈Į󰀆ĴĬĭ󰀙󰀛ı󰀈󰀅󰀃󰀇ĭ󰀋󰀐Įĭij󰀑󰀎ij󰀗󰀙󰀁ĭij󰀑ıIJ󰀑󰀆ijIJ󰀃󰀇ĭ󰀋įĮ󰀇ĭij󰀌󰀋󰀇ĭ󰀋󰀐Įĭij󰀑󰀎ij󰀗󰀎󰀆󰀂󰀇󰀏󰀕ı󰀑ĭ󰀘 4󰁎նЪΚʓ󰃷τ4󰁎ʹɲ”a”󰃛󰀰¨ʺ󰂛ԓ󰀖ΣʹɅך󰃩󰃮l¨ʺ̵󰀥w(location)󰃠ʹL(font)ƊPɺԬ󰃢PնЪΚʓݜգɭ󰃭󰀚󰃳󰁼󰀰Ⱥ󰂛󰂨󰃊5󰂱

󰀙󰀛ı󰀈󰀅󰀃󰀇ĭ󰀋󰀐Įĭij󰀑󰀎ij󰀗󰀙󰀁ĭij󰀑ıIJ󰀑󰀆ijIJ󰀃󰀇ĭ󰀋󰀊Į󰀇ĭij󰀌󰀋󰀇ĭ󰀋󰀐Įĭij󰀑󰀎ij󰀗󰂂ƌPʷ4󰁎TRowΧҺ̵ȭ󰃷ʯ󰂟<ݜգ̵ɭ󰃭ʪ󰁡<󰀮󰀥󰁟ɥXʜ(tiled horizontally)ʪ󰁡󰀨󰀠󰂆ʯݜգ󰀚m󰂿ȭ󰃷Σ󰀥wƌ

ʪ=8ʣʹɅΣ֧Ъ󰃱ˁ󰂩󰂠ʓ8ΣʹɅƊʪ󰁡ΚʓΣڲ֧Ъ󰃱ˁ󰂩c󰂘ն󰁓ΣԎʾ󰃳󰁼󰀰Σƌ4󰁎󰂠ʓ8󰃳󰂌󰂛ʣʹLɕܧ󰂐ΣʹɅ󰂖w󰂩100󰁎ʹɅΚʓ󰀩󰂝󰀥ASCIIʹɅлΣڲ֧󰃾󰃩󰃮l󰁾󰃹󰂠ʓΣ`󰂹ƌʣ󰀚ʪ=ȫ󰂓ɍ󰂠ʓ8nPɺ̽hӂ100󰂔8ʣʹ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)

󰀎󰀖󰀋󰀇󰀈󰀒󰀇󰀛󰀦ijIJ󰀌󰀊󰀇󰀄󰀅󰀉󰀄󰀎󰀑ij󰀊󰀅󰀁ijĮı󰀄󰀡󰀞󰀒ij󰀗󰀋󰀇󰀈󰀒󰀇󰀛󰀦ij󰀂󰀇ĭ󰀌󰀤󰀒󰀇󰀝󰀟󰀇󰀖󰀌󰀂󰀖󰀋󰀇󰀈󰀒󰀇󰀛󰀦ij󰀠󰀤󰀒󰀇󰀣󰀌󰀒󰀖󰀇IJijIJ󰀌ij󰀦󰀒ĭ󰀌󰀌ı󰀒IJĴ󰀋ij󰀌󰀔󰀁󰀌󰀒󰀖󰀇IJij󰀇ĭ󰀛󰀌󰀖󰀋󰀇󰀈󰀒󰀇󰀛󰀦ij󰀒󰀋IJ󰀒󰀌󰀌󰀐󰀒󰀛󰀇ĭ󰀌󰀌󰀖󰀋󰀇󰀈󰀒󰀇󰀛󰀦ij󰀆󰀅ı󰀒󰀈ij󰀒󰀊󰀌󰀌󰀈󰀚󰀚󰀌ijĮ󰀌įĮĮ󰀋󰀌Į󰀖󰀌󰀖󰀋󰀇󰀈󰀒󰀇󰀛󰀦ij󰀊󰀌󰀌ı󰀒IJĴ󰀋ij󰀌󰀖󰀋󰀇󰀈󰀒󰀇󰀛󰀦ij󰀊󰀌󰀌󰀒ĭ󰀚󰀊󰀑󰀋󰀇󰀒ĭij 󰀌󰀊󰀇󰀄󰀅󰀉󰀄󰀎󰀑ij󰀥󰀡󰀏į󰀒ı󰀈ij󰀇Įĭ󰀂󰀇ĭ󰀌󰀒󰀖ijı󰀇ĭIJ󰀇󰀅󰀕ij󰀈ij󰀒󰀝 󰀌󰀈Įĭ󰀁ı󰀉ij󰀉󰀊󰀇󰀄󰀅󰀉󰀄󰀎󰀑ij󰀎󰀇ĭijı󰀇ĭIJ󰀇󰀅󰀕ij󰀈ij󰀒󰀌󰀍ĭIJ󰀑󰀅ı󰀉󰀈Įĭ󰀁ı󰀉ij󰀉󰀊󰀇󰀄󰀅󰀉󰀄󰀎󰀑ij󰀎󰀈󰀋󰀋󰀕ij󰀈ij󰀒󰀡󰀏į󰀒ı󰀈ij󰀇Įĭ󰀂󰀇ĭ󰀌󰀒󰀖ijı󰀇ĭIJ󰀇󰀅󰀕ij󰀈ij󰀒󰀝 󰀡󰀏į󰀒ı󰀈ij󰀇Įĭ󰀂󰀇ĭ󰀌󰀒󰀖ijı󰀇ĭIJ󰀇󰀅󰀕ij󰀈ij󰀒󰀝

ȜʜΚʓӿ󰂡ʂնЪΚʓʷ󰂟ʙ̦'

󰀅󰀍󰀇󰀄󰀅󰀊󰀄󰀑󰀕ij󰀍󰀅󰀁ijĮı󰀄󰀈󰀋󰀈󰀐󰀍󰀇󰀄󰀅󰀊󰀄󰀑󰀕ij󰀍󰀅󰀁ijĮı󰀄 󰀅󰀉󰀇󰀄󰀊ĭij󰀎󰀅󰀉󰀇󰀄󰀊ĭij󰀒󰀈󰀄󰀃󰀄󰀇󰀂󰀊󰀌ij󰀅įĮĮ󰀄󰀅󰀉Įĭ󰀁ı󰀊ij󰀊󰀍󰀇󰀄󰀅󰀊󰀄󰀑󰀕ij󰀎󰀈󰀋󰀈󰀐󰀉Įĭ󰀁ı󰀊ij󰀊󰀍󰀇󰀄󰀅󰀊󰀄󰀑󰀕ij󰀄ĭijı󰀄ĭIJ󰀄󰀁󰀌ij󰀅ij󰀊󰀅󰀉Įĭ󰀁ı󰀊ij󰀊󰀍󰀇󰀄󰀅󰀊󰀄󰀑󰀕ij󰀒󰀈󰀋󰀈󰀐󰀉Įĭ󰀁ı󰀊ij󰀊󰀍󰀇󰀄󰀅󰀊󰀄󰀑󰀕ij󰀄ĭijı󰀄ĭIJ󰀄󰀁󰀌ij󰀅ij󰀊󰀋Ռί(Participants)

󰀷󰁧TFlyweight(Glyph)

Ǔ󰁧Ҭɽ󰀓H4󰁎9󰀣նЪΚʓ󰀠󰂆ʯɞ󰂓Λ󰂭M͇ɕʾɺƌ 󰀷󰁧TConcreteFlyweight(Character)

Ǔ󰁧ԎʾնЪΚʓ9󰀣̠󰂊ȗɇ󰂓Λ󰂭¨ʺ󰀩ʷ󰂁󰂌Σ󰀠󰃾ƌ 4󰁎

TConcreteFlyweightɪl󰀠󰂆ʙ̦ƊA󰂟̵¨ʺΣΛ󰂭ɪl󰀥ɇʯΣƏGɪlՌ󰃊5󰂚ʅΣƌ 󰀷󰁧TUnsharedConcreteFlyweight(Row,Column)

Ǔ󰁧̠8󰀥󰃳󰂌ΣնЪΚʓ󰀽󰀠󰂆ʙ̦ƊնЪΚʓ9󰀣󰀥󰀠󰂆ʙ̦Σʼ

̠8󰁃󰁉ʷ󰁡Ɗ4ITUnsharedConcreteFlyweightΚʓʯնЪΚʓ󰃜ˇ󰁏󰁮8󰃪̤󰀥󰀝(level)󰀠󰂆󰂌TConcreteFlyweightʾ=ȭ󰃷󰀩ʷRowɕColumn󰂌TConcreteFlyweightʾ=ȭ󰃷󰃾ƌ 󰀷󰁧TFlyweightFactory

Ǔ󰁧󰁮󰀙̠ԭ󰀪նЪΚʓƌ

Ǔ󰁧זϙնЪΚʓɱזΣʙ̦Ɗs4󰁎PɺԬ󰀬󰁶4󰁎նЪΚʓ󰀚

TFlyweightFactory󰃢P4󰁎󰁫ʺΣΚʓԎP󰁽󰀂󰂌󰁫ʺΣc󰁮󰀙4󰁎ƌ 󰀷󰁧TClient󰀩PɺԬ󰃾

Ǔ󰁧Ծް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̽Σv󰁍󰁏Dƌ¨ʺ]в󰁐󰁍󰂌D󰁎ʪ0'

󰀷󰁧ʪʙɺ󰃩󰂈ˁΣΚʓԎPڲ֧Ъƌ 󰀷󰁧󰁅4󰁎ΚʓɇʯΛ󰂭Σڲ֧ƌ 󰀷󰁧ɞ󰂓Λ󰂭󰀥ˑ󰀕Ա󰃠¨ʺƌ

󰁏DΣնЪΚʓʙɺcv󰁍Σ]в󰁏Dƌv󰁍]в¥ίʙɺ5Λ󰂭֧Ъ󰃩󰁗󰂊ƌ󰃩v󰁍]в󰁨D̪󰂝󰂩sΚʓPɺɇʯɕɞ󰂓Λ󰂭ΣԎ󰁰֧ЪƏ󰃩󰁳󰀥sɞ󰂓Λ󰂭󰀥ɽ󰀕Ա5̪Σ󰃩a¨ʺƌ󰃏󰁣ʿ󰀠󰂆󰂆Q󰂔󰂀󰃜v󰁍]в'ʙɺ󰂆󰂈ˁɇʯΛ󰂭Σ󰀘ɭɕ ɞ󰂓Λ󰂭󰀘󰀕Ա󰀚вƌ

նЪ󰁣󰃜4I󰀑CC󰀘(Composite)󰁣󰃜󰂆󰂡ʂ4󰁎󰀥󰂳󰁏󰁮̵ӿL8󰀥󰂆ʙɺ󰁚v³(leaf nodes)Əʙ̦Σ󰀑󰂁󰀥󰀥նЪΚʓ󰁚v³󰃮Έ¨ʺ󰃓Cٗv³Σ󰃓֫ƌ󰂛ԓΣٗv³󰃓֫m󰂿󰃚նЪΚʓ󰂆ʾ=ɞ󰂓Λ󰂭Ɗ󰃏󰁣󰂌4󰁎󰃏󰀰Σ֋Åʯ󰃏󰁎󰀥󰂳󰁏󰁮8ΣΚʓʷ󰂟Ռ̵󰀨ΣΚʓp󰃚ƌ

Ԏʾ(Implementation)

ԎʾնЪΚʓ󰀚󰁾󰃹Ȝʜ¿ܨ' 1. 󰀃󰀄ɞ󰀆Λ󰀆'󰃏󰁎󰁣󰃜Σ󰀠ɺ󰂗󰁘ͩ󰂩󰀨󰀥ˑ󰂀ϕ󰁘ͩɞ󰂓Λ󰂭ɕ7ʙɺΚв8󰁚󰂵Ɗʷ󰂁8ʣ󰂔󰃜Σɞ󰂓Λ󰂭ՌʙɺcΣΚʓ֧Ъ4󰁣󰀉󰁤󰁚󰁠ɞ

󰂓Λ󰂭󰃮ˍ󰂩󰂈ˁ¨ʺ]в󰀘ɭƊ󰀪󰁦Ȟɞ󰂓Λ󰂭󰀠󰂆7󰀞4󰁎Κʓ󰀕Ա5̽󰀠󰂆󰂈ˁ¨ʺΣ󰁼󰁶ƌ

ʯ󰂠ʓ󰀴٨Pȭ8ƏM󰀮󰀠󰂆¨ʺ4󰁎ʹL󰂱󰂂ԓ󰀖(map)󰂩󰀞4󰁎󰀑󰁮8󰃩a¨ʺʯʹɅΚʓ8Ɗ󰃏󰁎ԓ󰀖󰀫Ã󰀸´PɺʙɺΣʹLޚ󰂗Ɗs4󰁎ʹɅݜգɭ󰃭󰀚Ə󰀨5̽ʹLޚ󰂗ʷʣݜգ󰁐󰀠Σ󰁌ʾɺ(side-effect of the draw traversal)ƌʪ=󰂠ʓ4I󰃛Pɺ̽;֧Σ8ʣʹLɕ󰂶󰃜Ɗ 󰃏̤󰂱󰂂¨ʺ󰀘ɞ󰂓󰀥󰁖¨ʺ󰀘ɇʯ̙󰂌󰂔󰁓ƌ

2. ԭ󰀌ʙɺΚʓ' ʪ=Κʓ󰁡ʙɺƊPɺԬ8󰀖ΦM󰁮󰀙ΚʓƌնЪΚʓȰ

։󰁨PɺԬ󰁴󰁂󰂠ͩնЪΚʓƊնЪΚʓȰ։4IPɺ4󰁎\"C¨ʺ

(associative store)󰂆󰁨PɺԬ󰁴󰁂󰁼󰀰ΣնЪΚʓƌPʷʯ󰂠ʓ󰀴٨󰃼󰀃8Ծް4󰁎նЪΚʓʹɅ1󰁾τƊԭ󰀪ί̩ػʹɅךmʫɱזΣնЪΚʓƊ󰃩ʷ󰂁󰀂󰂌󰂛ԓ󰀖ΣΚʓc󰁮󰀙4󰁎mʫƌ

ʙɺʣ󰀚ȤԎʾ4̤󰂛󰂨Σ󰁻󰁾󰀕֧ɕ͓˧ʫ󰂚󰃃DƊs󰃪󰁎նЪΚʓ8ʚ󰁼󰀰󰀚ȼ󰂆󰂚ʫ`󰂃󰂄]вƌs󰂬ʷ󰂁նЪΚʓΣ֧Ъ󰀥͒ͩΣ󰃠󰀈;󰀚󰂆ȞQί󰀽8󰀥ɪ󰀰Σ󰀩PʷASCIIʹɅΣնЪΚʓ󰃾Ə󰁡󰀚նЪΚʓ󰀥

Ծ󰀫8󰂴Σƌ

󰀑P󰀑󰀙(Sample Code)

󰂆󰂠ʓ󰂶󰃜PȭƏM󰀮󰀠󰂆ͩ󰁿4󰁎TGlyphնЪӿLΚʓΣ󰃃󰂀󰃜ˇƊ󰃗٨ȞӿLTGlyph󰀥C󰀘󰁣󰃜ط󰂌ӿ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ʯglyph󰀑󰁮8Σ󰀥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ʯTGlyph󰀑󰁮8Σ󰀥wƊTGlyphContext.Nextʯ󰀫ÃΣӂ󰂼8󰂿󰁗F_indexƌTGlyphΣȭ󰃜ˇ󰀩TRowɕTColumn󰃾ʯӂ󰂼8ΣA4³ɪlԎʾNext͍󰁔TGlyphContext.Nextƌ

TGlyphContext.GetFontPɺ۰󰀘iȗBTree󰀑󰁮ƏBTree¨ʺTGlyphՌʹLΣԓ󰀖ƌBTreeΣ󰁅4󰁎v³=󰁅4󰂠ͩʹL󰂱󰂂֫ʂϳʹ󰁟Σ`󰂹ƏBTreeΣ󰁚v³󰃓C4󰁎ʹLƏ󰃩BTreeɇ󰂓v³󰀩a󰁚v³󰃾=󰁅4󰁎ȭʹ󰁟󰁥¿f'[Ã󰂛ʣʹL󰂶󰃜󰀘4ȭʹ󰁟󰂂ɍ󰀘󰀝ʹ󰁟ƌ

󰀬󰁾󰃹󰀩P202󰃾84,󰂠󰂉ΣvٷƏ̵BTreeʹL󰂱󰂂󰀑󰁮󰀠D󰂗󰂞̪ʷȜӿ'

󰁥¿f'ɇ󰂓v³󰀩󰂝󰂪󰃾ɇȺ֧ʹ󰃷τʹ֧Ə󰀠ԓ󰀖P202ɇȺ֧ʹ󰂂

󰀘󰀙󰀑󰀑󰀍󰀑󰀑󰀘󰀖󰀖󰀘󰀑󰀑󰀈󰀘󰀖󰀅󰀚󰀘󰀙󰀘󰀚󰀁 󰀔󰀆Ĭ󰀏IJ󰀋󰀅󰀔󰀆Ĭ󰀏IJ󰀌󰀛ij󰀇󰀊󰀆󰀃󰀘󰀋󰀔󰀆Ĭ󰀏IJ󰀘󰀋󰀔󰀆Ĭ󰀏󰀌󰀗Į󰀊󰀕󰀘󰀋󰀎ĮĴı󰀆󰀏ı󰀋󰀅 ɇ󰂓v³ͩ󰁿Tglyph1󰁾(indices)Σ󰂟󰂯ƏBTree¥ϳʹLN󰂴󰃠¥ϳTGlyph7󰀑󰁮8󰁗󰂊󰃠󰁚󰁠󰃩N󰂴ƌPʷ󰀭ʷM󰀮ʯ1󰁾102󰁺6󰁎ʹɅ󰂺expect󰃕󰀵=󰃛Times-Italic12󰃡N=󰃛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;

ёΣBTree󰀑󰁮cN󰀘ʷȜӿ󰃳ʂ'󰀩ʷ󰂦󰀆󰂨󰃳ʂ󰃾 󰀓 󰀏󰀄Ĭ󰀋IJ󰀇󰀃󰀉󰀍󰀍󰀔󰀍󰀍󰀓󰀑󰀑󰀕󰀓󰀔󰀓󰀕󰀁󰀏󰀄Ĭ󰀋IJ󰀓󰀇󰀏󰀄Ĭ󰀋󰀈󰀒Į󰀆󰀐󰀓󰀇󰀊ĮĴı󰀄󰀋ı󰀇󰀃󰀭󰀏M󰀮ʚ󰁗󰂊󰂺don’t󰃕󰀩󰂊4]󰂶󰃾ʹ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;

ёΣBTree󰀑󰁮cN󰀘ʷȜӿ󰃳ʂ'󰀩ʷ󰂦󰀆󰂨󰃳ʂ󰃾 󰀘󰀙󰀑󰀈󰀍󰀑󰀈󰀘󰀖󰀖 󰀈󰀋󰀑󰀑󰀚󰀘󰀚󰀁󰀘󰀑󰀑󰀘󰀙 󰀔󰀆Ĭ󰀏IJ󰀋󰀅󰀔󰀆Ĭ󰀏IJ󰀌󰀛ij󰀇󰀊󰀆󰀃󰀘󰀋󰀔󰀆Ĭ󰀏IJ󰀘󰀋󰀔󰀆Ĭ󰀏󰀌󰀗Į󰀊󰀕󰀘󰀋󰀎ĮĴı󰀆󰀏ı󰀋󰀅 s?cΣTGlyphCTGlyphContext%󰂌ʹL󰀚ƏTGlyphContextCBTree󰀸󰁂ƊTGlyphContext^󰁢󰂿󰁗1󰁾Φ̽̐̽?cTGlyph1󰁾󰃳󰃓CΣʹ󰃝ƌʪ=ʹL󰂴,Σ¦󰁓Ԏʯ8󰀾ƏBTreeΣȫ7󰂛ԓ󰂩TGlyph󰀑󰁮ȫ7󰀥󰀏7Σƌ󰃳󰁼Pɺ`󰂃󰂄Σ󰀘ɭW;Ȥɮ󰁗󰂊󰁴󰁂󰀚в(look-up time)ƌ󰁿f'󰁴󰁂󰀚вʯ󰃏󰁎󰁏󰁮(schema)Ȝ󰀥Ռ󰂝󰁪󰂴,󰀘󰁖PƊ󰁨QΣΛ΍󰀥sʹ󰃝󰀥󰁅󰁎ʹ󰀽Pɺ8ʣΣʹ󰃝ƊʼʯԎ󰃉Ȟ󰃏󰀥󰀈;󰂔ɹΣƌ󰂟

󰁨󰁺4󰁎Κʓ󰀰b󰁆Σ󰀥FlyweihgtFactory󰀩նЪΚʓȰ։󰃾ƏTflyweihgt- Factory󰁮󰀙TGlyph̠זϙ̵ʙɺƊ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_character󰀥4󰁎󰂵󰂽¨ʺ󰃓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_character󰂵󰂽8󰁴󰁂4󰁎ʹɅƊʷ󰂁ʺʯ󰃏󰁎󰂝󰀵cmʫ󰂛ԓ󰀖ΣTGlyphƏʷ󰂁8ʺʯΣ󰀠c󰁮󰀙󰃏󰁎TGlyphƏʺȗf_character󰂵󰂽8Ə̠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󰀮ɪlN󰂴PɺԬΣPɺΣ󰁮󰀙̸֧ƌ󰁥¿f'ɪlۺ󰂾󰃏̤ TGlyphΚʓΣ󰁮󰀙̸֧󰂂

:ҬPɺΣPȭ(Known uses)

󰃏󰁎󰁣󰃜ΣѝY󰁨σɽInterViews3.0^󰀎а󰂔󰃩̪'󰀨Σа󰂔ίɺ󰂆󰀙ʅ4󰁎󰁃5Σ󰂠ʓ<󰀪ئԨ=DocƊDocPɺGlyphΚʓ󰂡ʂ󰂠ʓ8󰃳󰂌ΣʹɅƌPɺԬ=󰁅4󰁎󰂠ͩޚ󰂗(style)󰀩ӿLޚ󰂗󰃾ʹɅ󰀙ʅ4󰁎GlyphԎPƊʪ󰁡󰁅4󰁎ʹɅΚʓɇʯΛ󰂭󰀐ˠʹɅɕޚ󰂗󰂱󰂂󰀩ޚ󰂗τΣ1󰁾󰃾ƌ󰀩f'ʯc󰀣Σ󰂟P8ޚ󰂗󰂱󰂂󰀥ɞ󰂓ΣƊ󰃛󰂌ʹɅ󰀥ɇʯΣ󰃾@G󰃛󰂌󰀥w󰀥ɞʯΣƊ󰃏󰁣󰀠󰂆

󰁨DocxʾΣ̙̈\\ƌ󰂠ʓc󰂆Document󰃜ˇ󰃷τƊDocumentʣ󰀚Ȥ󰀥նЪΚʓȰ։ƌҬЇ󰁀󰀑󰂁Docʙ̦նЪΚʓ󰀥a,󰂌󰂔󰁓Σƌʯ4IΛ΍Ȝ180000ʹɅ󰃛󰁼󰀰480󰁎ʹɅնЪΚʓƌ

ET++PɺնЪΚʓ󰂚*(look-and-feel indepndence)󰀩f'󰁻؃󰂜gȰ։󰁣󰃜󰀞4󰂔look-and-feel indepndence󰃾ƌlook-and-feel indepndence󰃏󰀰󰀥LʂPɺԬ9󰀣Ʌʓ󰀩󰃠Ԩ=Ȱ̴(Widget)󰃾󰀩ʷJ󰃟CƋ󰁤Ь󰀤󰃾ɕ̵󰃐|󰀩ʷ󰂀֋Ƌmc󰀤󰃾ƌ󰃏̤Ʌʓ ̵ݜգȰʾ͝󰂜󰃚4󰁎LayoutΚʓƊN󰂴󰃏󰁎LayoutΚʓ󰀠󰂆N󰂴󰃳fɕ󰃘¿ƏM󰂸ʯ󰁣󰁪󰀌Ȥ󰀠󰂆ƌ

󰁅4󰁎Ȱ̴󰃜ˇ󰂌4󰁎󰂛ԓΣLayout󰃜ˇƏ󰃏󰂔󰂀󰃜󰂌4󰁎󰃜ܨ󰀥PɺΣLayoutΚʓ֧Ъ Q󰃃󰂩PɺԬ9󰀣Ʌʓ֧Ъ'ʪ=󰁅4󰁎PɺԬ9󰀣Ʌʓ󰀽󰂌4󰁎ܦɞΣLayoutΚʓƌ=۩F󰃏󰁎󰂅󰂌Ə󰃳󰂌ΣLayoutΚʓ󰀽Ԏʾ󰀘նЪΚʓƌ󰃏󰁎Layout󰀥4󰁎󰂛s8ٳΣնЪΚʓƊʪ=󰀨󰃏󰀰󰀥ͩ󰁿󰁪=Ə̠󰁳H󰃙m󰂿4̤ݜգȰ̴Κʓ󰀚󰁼󰀰󰀏7Σɞ󰂓Λ󰂭ƌ

LayoutΚʓɽLookΚʓ󰀙ʅɕԭ󰀪Ɗ󰃳󰂆LookΚʓ󰀥4󰁎󰂜gȰ։󰁣󰃜Ɗ󰀨󰂆GetButtonLayOut()ƋGetMenuBarLayout()󰀤̸֧󰃢ͅ󰂠ͩȰ̴Κʓƌ󰁅4󰁎look-and-feel֫ѱ󰂌4󰁎󰂛ԓ󰀖ΣLook󰀝󰃜ˇ󰂆󰂚*󰂛ԓΣLayoutΚʓƌ

󰀞ɞLayoutΚʓ󰀥ɪ󰀰Σ󰀁󰂼󰀩󰁻󰁾󰀁󰂼󰁣󰃜(Strategy)󰃾Ɗ󰀨󰀥4󰁎󰀁󰂼Κʓ󰂆նЪ󰁣󰃜Ԏʾƌ

󰀂󰀚󰀛󰀙(Related Patterns)

նЪ󰁣󰃜4IՌC󰀘󰁣󰃜󰀑C󰂆ԎʾK󰂓Σ󰀥󰂳󰁏󰁮ƏȤ󰂇󰀥4󰁎ΦMa󰃦L(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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务