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