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.0297 sec