E D R , A S I H C RSS

Adapter

DPSC p105

ADAPTER(DP139)

Intent

ด๋ž˜Šค ธ„Ž˜ดŠค๋ฅผ ˜ˆƒ๋˜๋Š” ๋‹ค๋ฅธ ธ„Ž˜ดŠค๋กœ˜ ๋ณ€™˜„ •œ๋‹ค. Adapter๋Š” ƒด•œ ธ„Ž˜ดŠค ๋•Œ๋ฌธ— ๋‹ค๋ฅธ ๋‹ฌ๋ž๋˜ ด๋ž˜Šค˜ ผ„ ๋ฌถ๋Š” —ญ• •Œ •œ๋‹ค.

Discussion

Adapter๋Š” œ„—๋„ ˜๋ฏธ•œ ๊ฒƒ๊ณผ ๊ฐ™ด Šน๋ณ„•œ(ผ๋ฐ˜   ‘๊ทผ„ ๋ฒ—–ด๋‚œ) object๋“ค„ client๋“คด ๊ณ œ ˜ ๋ฐฉ๋ฒ•(Targets)œผ๋กœ  ‘๊ทผ•˜๋„๋ก •ดค€๋‹ค.

Class Adapter

Smalltalk—„œ Design Patterns˜ Adapter Œจ„ด class๋ฒ„ „„  šฉ ‹œ‚คง€ ๋ชป•œ๋‹ค. class ๋ฒ„ „€ ๋‹คค‘ ƒ†œผ๋กœ ๊ทธ ๊ธฐ๋Šฅ„ ๊ตฌ˜„•˜๊ธฐ ๋•Œ๋ฌธด๋‹ค.

DP๊ทธ๋ฆผ

A C++/Smalltalk Difference

DP˜ p147„ ๋ณด๋ฉด Adapterด๋ž˜Šค๋Š” ๋ฐ˜๋“œ‹œ ๊ทธ๊ฒƒ˜ Adaptee๋ฅผ ƒ€ž…œผ๋กœ „ –ธ•ด„œ ๊ฐ€ง€๊ณ  žˆ–ด•ผ๋งŒ •œ๋‹ค.ด๋Ÿฐ ๊ฒฝšฐ—๋Š” •ด๋‹น ด๋ž˜Šค™€ ๊ทธ๊ฒƒ—„œ ƒ†๋˜๋Š” ด๋ž˜Šค๋“ค๋งŒด ๊ธฐ๋Šฅ„ ‚ฌšฉ(adapt)• ˆ˜ žˆ๋‹ค. Smalltalk—„œ —„๊ฒฉ•œ ˜•๊ฒ€‚ฌ(Strong Typeing) กดžฌ •Šœผ๋ฉด, class ๊ฐ€ Adapter—„œ Adaptee๋กœ ๋ณด๋‚ด–ดง€๋Š” ๋ฉ”„ง€๋ฅผ ๋ณด๋‚ผˆ˜ žˆ๋Š” ดƒ Adaptee๊ฐ€ –ด๋– •œ ด๋ž˜Šค๋ผ๋„ ƒ๊ด€—†„ ๊ฒƒด๋‹ค.

DeleteMe ) ๋งด ดƒ•ด„œ ฐจ›„ ˆ˜ • --ƒ๋ฏผ

Implementation

Tailored Adapter

ž ๊ทธ๋Ÿผ Adapter๋ฅผ  šฉ‹œ‚ค๋Š” ‹œ๋‚˜๋ฆฌ˜ค๋ฅผ ‹œž‘•ด ๋ณธ๋‹ค. Design Patterns(DP139)—„œ DrawingEditor๋Š” ๊ทธ๋ž˜”ฝ ๊ฐฒด๋“ค๊ณผ Shape˜ ƒ†๋„ƒ˜ ด๋ž˜Šค ธŠค„Šค๋“ค„ ๋ชจ•„ ๊ด€๋ฆฌ•˜˜€๋‹ค. DrawingEditor๋Š” ด๋Ÿฐ ๊ทธ๋ž˜”ฝ ๊ฐฒด๋“ค๊ณผ˜ †Œ†ต„ œ„•˜—ฌ Shape ”„๋กœ† ฝœ„ ๋งŒ๋“ค–ด ด ๊ทœน™— ๋งž๋Š” ๋ฉ”„ง€๋ฅผ ดšฉ•œ๋‹ค. •˜ง€๋งŒ textธž˜ ๊ฒฝšฐ šฐ๋ฆฌ๋Š” ด๋ฏธ กดžฌ•˜๊ณ  žˆ๋Š” TextViewƒ—„œ ด๋ฏธ ๊ตฌ˜„๋œ ๊ธฐ๋Šฅ„ ‚ฌšฉ•œ๋‹ค. šฐ๋ฆฌ๋Š” DrawEditior๊ฐ€ TextView™€ ผ๋ฐ˜ œผ๋กœ “ฐด๋Š” Shape™€ ๊ฐ™ด ƒ˜ธž‘šฉ •˜๊ธฐ๋ฅผ ›•œ๋‹ค. ๊ทธ๋ ‡ง€๋งŒ TextView๋Š” Shape˜ ”„๋กœ† ฝœ„ ๋”ฐ๋ฅดง€ •Š๋Š” ๋‹ค๋Š”  ด ๋ฌธ œด๋‹ค. ๊ทธ๋ž˜„œ šฐ๋ฆฌ๋Š” TextShap˜ Adapter class๋ฅผ Shape˜ ž‹(subclass)๋กœ  •˜ •œ๋‹ค. TextShape๋Š” ธŠค„Šค๋กœ TextView˜ ฐธกฐ(reference)๋ฅผ ๊ฐ€ง€๊ณ  žˆœผ๋ฉฐ, Shape”„๋กœ† ฝœƒ—„œ˜ ๋ฉ”„ง€๋ฅผ ‚ฌšฉ•œ๋‹ค.; ด๋“ค ๊ฐ๊ฐ˜ ๋ฉ”„ง€๋Š” ๊ฐ„๋‹จžˆ ๋‹ค๋ฅธ ๋ฉ”„ง€๋กœ บกА™”๋œ TextView—๊ฒŒ  „๋‹ฌ๋˜–ด ˆˆ˜ žˆ๋‹ค. šฐ๋ฆฌ๋Š” ๊ทธ๋•Œ TextShape๋ฅผ DrawingEditor™€ TextView‚ฌด— ๋ถ™ธ๋‹ค.

๊ทธ๋ฆผ

TextShape๋Š” Shape— translator๊ฐ™€ Šน๋ณ„•œ ผ„ œ„•œ ๊ธฐ๋Šฅ„ ง ‘ ถ”๊ฐ€•œ ๊ฒƒœผ๋กœ Shape˜ ๋ฉ”„ง€๋ฅผ TextView Adaptee๊ฐ€ ด•ด • ˆ˜ žˆ๋Š” ๋ฉ”„ง€๋กœ ๋ณ€™˜ ‹œ‚จ๋‹ค.:•˜ง€๋งŒ DrawingEditor๊ฐ€ TextSape— ๋Œ€•œ ๋ฉ”„ง€๋ฅผ ๋ณด๋‚ผ๋•Œ TextShape๋Š” ๋‹ค๋ฅดง€๋งŒ ๋ฌธ๋ฒ• œผ๋กœ ๋™ผ•œ ๋ฉ”„ง€๋ฅผ TextView ธŠค„Šค—๊ฒŒ ๋ณด๋‚ธ๋‹ค.

ดฒ˜๋Ÿผ Adapter๊ฐ€  •˜๋˜–ด ธ žˆ๋‹ค๋ฉด Adapter™€ Adaptee–‘ชฝ˜ ธ„Ž˜ดŠค๋ฅผ ด๋ฏธ •Œ๊ณ  žˆ๋Š” …ˆด๋‹ค.;๊ทธ๋ž˜„œ šฐ๋ฆฌ๋Š” Shape ๋ฉ”„ง€๋ฅผ TextView๋ฉ”„ง€— ๋งžถ”๋Š” •ด„ ๊ณผ •๊ณผ ๊ฐ™€ Adapter๋ฅผ ด๋Ÿฐ Šน๋ณ„•œ šฉ๋„— ๋งžถ”–ด ๋งŒ๋“คˆ˜ žˆ๋‹ค. šฐ๋ฆฌ๋Š” ด๋Ÿฐ๊ธ Teilored Adapter๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

—ฌ๊ธฐ— TextShape Adapter๊ฐ€ ๊ทธ๊ฒƒ˜ Adaptee๋ฅผ œ„•ด ๋ฉ”„ง€๋ฅผ •ด„•˜๋Š” ๋ชจŠต˜ interaction diagramด žˆ๋‹ค.

๊ทธ๋ฆผ

Message-Forwarding Pluggable Adapter

šฐ๋ฆฌ๋Š” Tailored Adapter•ˆ—„œ ๋ฉ”„ง€๋ฅผ •ด„„ œ„•˜—ฌ •ด๋‹น  „šฉ ๋ฉ”†Œ๋“œ๋ฅผ ๋งŒ๋“คˆ˜ žˆ๋‹ค. ™œ๋ƒ•˜๋ฉด ๋””žธ ‹œ๊ฐ„— Adapter™€ Adaptee˜ ”„๋กœ† ฝœ„ •Œ๊ณ  žˆ๊ธฐ ๋•Œ๋ฌธด๋‹ค. The Adapter class๋Š” œ ผ•œ ƒ™ฉ˜ •ด„„ œ„•ด„œ ๋งŒ๋“ค–ด „๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ˜ Adapter˜ ๋ฉ”†Œ๋“œ๋Š” Adaptee— ๋Œ€•œ •Œ๋งž€ ๋ฉ”„ง€๋“ค— ๋Œ€•˜—ฌ hard-codes( „šฉ •จˆ˜  •๋„˜ ˜๋ฏธ๋กœ ƒ๊ฐ) ด๋‹ค


Adapter‹œ๋‚˜๋ฆฌ˜ค˜ ๋‘๋ฒˆงธ๋Š” Adaptee˜ ธ„Ž˜ด๋ฅผ ๋””žธ ‹œ๊ฐ„— •Œˆ˜ —†„ ๋•Œ ด๋‹ค. Adaptee˜ ธ„Ž˜ดŠค๋ฅผ ๋จผ € •Œˆ˜ —†๊ธฐ ๋•Œ๋ฌธ— šฐ๋ฆฌ๋Š” •˜๋‚˜˜ ธ„Ž˜ดŠค—„œ ๋‹ค๋ฅธ ๊ฒƒœผ๋กœ ๋ฉ”„ง€๋ฅผ ๊ฐ„๋‹จžˆ •ด„• ˆ˜ —†๋‹ค. ด๋Ÿฐ ๊ฒฝšฐ—๋Š” ๋ฉ”„ง€˜ ๋ณ€˜•๊ณผ  „๋‹ฌ˜ ผ๋ฐ˜  ๊ทœน™— ๋งžถ”–ด Pluggable Adapter๋ฅผ ‚ฌšฉ•œ๋‹ค. Tailored Adapter™€ ๊ฐ™ด Pluggable Adapter๋„ •ด„๊ธฐ๋ฅผ Client™€ Adaptee‚ฌด˜ •ด„๊ธฐ๋ฅผ  œ๊ณต•œ๋‹ค. •˜ง€๋งŒ ๊ฐ๊ฐ˜ Šน๋ณ„•œ ๊ฒฝšฐ๋ฅผ œ„•œ ƒˆ๋กœšด Adapterด๋ž˜Šค˜  •˜๋ฅผ •„š”•˜ง€ •Š๋‹ค. Pluggable Adapter๊ฐ€ “ฐด๋Š” ๊ฒฝšฐ˜ ƒƒœ๋ฅผ ƒ๊ฐ•ด๋ณดž

ƒ˜ธ ž‘šฉ(‚ฌšฉž๊ฐ€ ง ‘ ดšฉ•˜๋Š”˜๋ฏธ)•˜๋Š” –ด”Œ๋ฆฌผ€ด…˜„ œ„•œ Model-View-Controller(MVC) Œจ๋Ÿฌ๋‹คž„—„œ View ๊ฐฒด๋“ค(™”๋ฉดƒ— ‘œ˜„„ ๋‹ด๋‹น•˜๋Š” widget๋“ค) € ๋ฐ‘๋ฐ”ƒ•— ๊น”๋ คžˆ๋Š” –ด”Œ๋ฆฌผ€ด…˜ ๋ชจ๋ธ๊ณผ —ฐ๊ฒฐ๋˜–ด„๋‹ค. ๊ทธ๋ž˜„œ ๋ชจ๋ธ•ˆ—„œ˜ ๋ณ€™”๋Š” œ  € ธ„Ž˜ดŠค— ๋ฐ˜˜•˜๊ณ  ธ„Ž˜ดŠค ƒ—„œ ‚ฌšฉž๋“ค— ˜•œ ๋ณ€™”๋Š” ๋ฐ‘— œ„น˜•œ ๋˜–ดง€๋Š” ๋ชจ๋ธ ๋ฐด„ฐ(moel data)— ๋ณ€™”๋ฅผ œ ๋„•œ๋‹ค.View๊ฐ œ๋“คด  œ๊ณต๋˜–ด žˆ๋Š” ƒƒœ๋ผ„œ –ด๋– •œ ƒ˜ธ ž‘šฉ•˜๋Š” –ด”Œ๋ฆฌผ€ด…˜ ƒ—„œ๋ผ๋„ ๊ทธ๋“ค€ ใ…ก๊‚ฌšฉ• ˆ˜ žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ทธ๋“ค€ ๊ทธ๋“ค˜ ๋ชจ๋ธ๊ณผ˜ †ต‹ „ œ„•ด ผ๋ฐ˜ ธ ”„๋กœฝ”ฝœ„ ‚ฌšฉ•œ๋‹ค;Šน๋ณ„•œ ƒ™ฉ—„œ ๋ชจ๋ธ๋กœ ๋ณด๋‚ด–ดง€๋Š” getter message๋Š” ๊ฐ’ด๊ณ  ผ๋ฐ˜ ธ setter message—ญ‹œ ๊ฐ’ด๋‹ค.:˜ˆ๋ฅผ ๋“คž๋ฉด ๋‹คŒ ˜ˆ œ๋Š” VisualWorks TextEditorView๊ฐ€ ๊ทธ๊ฒƒ˜ contects๋ฅผ –ป๋Š” ๋ฐฉ๋ฒ•ด๋‹ค.


~cpp 
    TextEditorView>>getContents
        | t |
        t := model valud
        ^t == nil
            ifTrue: [Text new]
            isFalse: [t]
p108

๋ฐ˜๋ฉด— –ด”Œ๋ฆฌผ€ด…˜ ๋ชจ๋ธ ˜ค”„ Šธ๋“ค€ ผ๋ฐ˜ œผ๋กœ ๋‹ค–‘•œ ๋ชจŠต„ •˜๋‚˜˜ ๊ฐ’— ๋ณด๋‹ค๋Š” ๊ฐ€ง€๊ณ  žˆ๋‹ค. ๊ทธ๊ฒƒ๋“คด •˜๋‚˜˜ ๋ชจŠตœผ๋กœ ‘œ˜„๋˜ง€๋งŒ, ๋ชจ๋ธ ๊ฐฒด๋“ค€ value™€ value:— ๋ณด๋‹ค ๋ถ„•ผ— •Œ๋งž๋Š” accessor message๋ฅผ ข€๋” ๋งŽ€ ˜๋ฏธ๋ฅผ ง€๋‹Œ ด๋ฆ„œผ๋กœ “ฐธ๋‹ค. (DeleteMe ˆ˜ • •„š”). ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ œ ๋Š” šฐ๋ฆฌ๊ฐ€ –ด๋–ป๊ฒŒ ๋ทฐ๋‚˜ ๋ทฐ˜ ๋ชจ๋ธ—„œ ๋ทฐ๊ฐ€ ๋ชจ๋ธด ด•ด• ˆ˜ —†๋Š” ๋ฉ”„ง€๋ฅผ ๋ณด๋‚ด๋ฉด žก•„๋‚ด๋А๋ƒ •˜๋Š”๊ฐ๋‹ค. •ด๊ฒฐ…€ šฐ๋ฆฌ๋Š” Pluggable Adapter, ๊ฐ’„ ๋ฉ”„ง€๋กœ ๋ณ€™˜ ‹œ‚ค๋Š” ๊ฒƒด๋ผ๊ณ   œ‹œ • ˆ˜ žˆ๋‹ค.- €๊ฒƒ(Pluggable Adapter)€ ๋ฉ”„ง€๋ฅผ ๊ฐ’ ๋ฉ”„ง€(value message)๋ฅผ ๋ฐ›„๋•Œ ๊ทธ๊ฒƒ˜ Adaptee๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒด๋‹ค. šฐ๋ฆฌ๋Š” value: ƒ—„œ๋„ ๊ฐ™€๊•ด• ˆ˜ žˆ๋‹ค.

ž ๊ทธ๋Ÿผ —ฌ๊ธฐ— ˜ˆ œ๋ฅผ ๋ณดž. šฐ๋ฆฌ๋Š” employee๊ด€๋ฆฌ application„ ๊ฐ€ง€๊ณ  žˆ๋‹ค๊ณ  ๊ฐ€ ••œ๋‹ค.–ด”Œ๋ฆฌผ€ด…˜ ๋ชจ๋ธ€ •˜๋‚˜˜ ธžธ, employee˜ ‚ฌšŒ ๋ณดžฅ(๋น„๋ฐ€) ๋ฒˆ˜ธ(social security number)˜ ฌ•จ•˜๊ณ  application˜ ‚ฌšฉž ธ„Ž˜ดŠค๋Š” employee˜ ‚ฌšŒ ๋ณดžฅ ๋ฒˆ˜ธ๋ฅผ ™”๋ฉดƒ— ๋ฟŒ๋ คฃผ๋Š” 'ž…๋ ฅ ๋ฐ•Šค ๋ทฐ'๋ฅผ ฌ•จ•œ๋‹ค.๋ชจ๋ธ˜ —‘„Šค•˜๊ณ  ˆ๊ธฐ™” ‹œ‚ค๊ธฐ œ„•œ ๋ฉ”†Œ๋“œ๋Š” 'socialSecurity'™€ 'socialSecurity:'๋กœ ด๋ฆ„ ง€–ด ธ žˆ๋‹ค. ž…๋ ฅ ๋ฐ•Šค๋Š” ๋‹จง€ ˜„žฌ˜ ‚ฌšŒ ๋ณดžฅ ๋ฒˆ˜ธ๋ฅผ ๋ฟŒ๋ฆฌ๊ธฐ๋งŒ •œง€๋งŒ ๋ชจ๋ธ˜ ๊ฐ’„ š”ฒญ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ„ •Œ๊ณ žˆ๋‹ค.( DeleteMe ˆ˜ • •„š” ) ๊ทธ๋ž˜„œ šฐ๋ฆฌ๋Š” value mesage๋ฅผ socialSecurity๋กœ ๋ณ€™˜ •ด•ผ •œ๋‹ค.šฐ๋ฆฌ๋Š” Pluggable Adapter ๊ฐฒด๋ฅผ ด๋Ÿฐ ๋ชฉ „ œ„•ด„œ ‚ฌšฉ• ˆ˜ žˆ๋‹ค.ž šฐ๋ฆฌ˜ ˜ˆ œ๋ฅผ œ„•œ interaction ๋‹คด–ด ๊ทธ๋žจ„ ๋ณดž

๊ทธ๋ฆผ

ด ๋‹คด–ด ๊ทธ๋žจ€ ๋‹จˆœ™” ‹œ‚จ๊ฒƒด๋‹ค.;๊ทธ๊ฒƒ€ ๊ฐœ๋… œผ๋กœ Pluggable Adpter˜ ˆ˜–‰ ๋ฐฉ‹„ ๋ฌ˜‚ฌ•œ๋‹ค.๊ทธ๋Ÿฌ๋‚˜, Adaptee—๊ฒŒ ๋ณด๋‚ดง€๋Š” ๋ฉ”„ง€๋Š” ƒง• œผ๋กœ ‘œ˜„๋˜๋Š” ๋ฉ”„ง€๋“ , šฐšŒ•ด„œ ๊ฐ€๋Š” ๋ฉ”„ง€๋“  ด๋Ÿฐ๊ฒƒ๋“ค„ —ˆ๊ฐ€•˜๋Š” perform:„ ดšฉ•˜—ฌ ‹ค œ๋กœ ‚ฌšฉ๋œ๋‹ค.|Pluggable Adpater๋Š” Symbol๋กœ„œ ๋ฉ”„ง€ ˆ˜ง‘ž๋ฅผ ๊ฐ€ˆˆ˜ žˆ๊ณ , ๊ทธ๊ฒƒ˜ Adaptee—„œ ๋งŒ•ฝ ๊ทธ๊ฒƒด ‰๋ฒ”•œ ๋ฉ”„ง€๋ผ๋ฉด ˆ˜ง‘žธ perform—๊ฒŒ –ด๋– •œ ‹œ๊ฐ„—๋„ ด•ผ๊ธฐ • ˆ˜ žˆ๋‹ค.|˜ˆ๋ฅผ ๋“ค–ด„œ selector ๊ฐ€ Symbol #socialSecurity๋ฅผ ฐธกฐ• ๋•Œ  „๋‹ฌ๋˜๋Š” ๋ฉ”„ง€ธ 'anObject socialSecurity'๋Š” 'anObject perform: selector' ๊ณผ ๋™ผ•˜๋‹ค. |ด๊ฒƒ€ Pluggable Adapter๋‚˜ Message-Based Pluggable Adapter—„œ ๋ฉ”„ง€- „๋‹ฌ(message-forwading) ๊ตฌ˜„๋˜๋Š” ‚คด๋‹ค.| Adapter˜ client๋Š” Pluggable Adapter—๊ฒŒ ๋ฉ”„ง€ ˆ˜ง‘ž˜ value™€ value: ๊ฐ„— †ต‹ „ •˜๋Š”๊•Œ๋ฆฐ๋‹ค,๊ทธ๋ฆฌ๊ณ  Adapter๋Š” ด๋Ÿฐ ๋‚ด๋ถ€  ˆ˜ง‘ž๋ฅผ ๋ณด๊ด€•œ๋‹ค.|šฐ๋ฆฌ˜ ˜ˆ œ—„œ ด๊ฒƒ€ client๊ฐ€ 'Symbol #socialSecurity™€ value ๊ทธ๋ฆฌ๊ณ  '#socialSecurity:'™€ 'value:' ด๋ ‡๊ฒŒ ๊ด€๊ณ„ ง€–ด„ Adapter™€ ด•ผ๊ธฐ •œ๋Š”๊˜๋ฏธ•œ๋‹ค.|–‘ชฝค‘ •„๋ฌด ๋ฉ”„ง€๋‚˜ ๋„ฐฉ• ๋•Œ Adapter๋Š” ๊ด€๋ จžˆ๋Š” ๋ฉ”„ง€ „ ƒž๋ฅผ ๊ทธ๊ฒƒ˜ 'perform:'.„ ‚ฌšฉ•˜๋Š” ค‘ธ Adaptee —๊ฒŒ ๋ณด๋‚ธ๋‹ค.|šฐ๋ฆฌ๋Š” Sample Code๋ถ€๋ถ„—„œ ๊ทธ๊ฒƒ˜  •™••œ ˆ˜–‰ ๋ฐฉ๋ฒ•„ ๋ณผ๊ฒƒด๋‹ค.

Parameterized Adapter

Alternative Solutions

Sambple Code

Known Smalltalk Uses

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:26
Processing time 0.0262 sec