DPSC p105
Intent ¶
ν΄λμ€ μΈν°νμ΄μ€λ₯Ό μμλλ λ€λ₯Έ μΈν°νμ΄μ€λ‘μ λ³νμ νλ€. Adapterλ μμ΄ν μΈν°νμ΄μ€ λλ¬Έμ λ€λ₯Έ λ¬λλ ν΄λμ€μ μΌμ λ¬Άλ μν μ νλ€.
Structure ¶
Discussion ¶
Adapterλ μμλ μλ―Έν κ²κ³Ό κ°μ΄ νΉλ³ν(μΌλ°μ μ κ·Όμ λ²μ΄λ) objectλ€μ clientλ€μ΄ κ³ μ μ λ°©λ²(Targets)μΌλ‘ μ κ·Όνλλ‘ ν΄μ€λ€.
Class Adapter ¶
Smalltalkμμ Design Patternsμ Adapter ν¨ν΄ classλ²μ μ μ μ© μν€μ§ λͺ»νλ€. class λ²μ μ λ€μ€ μμμΌλ‘ κ·Έ κΈ°λ₯μ ꡬννκΈ° λλ¬Έμ΄λ€.
DPκ·Έλ¦Ό
DPκ·Έλ¦Ό
A C++/Smalltalk Difference ¶
DPμ p147μ 보면 Adapterν΄λμ€λ λ°λμ κ·Έκ²μ Adapteeλ₯Ό νμ
μΌλ‘ μ μΈν΄μ κ°μ§κ³ μμ΄μΌλ§ νλ€.μ΄λ° κ²½μ°μλ ν΄λΉ ν΄λμ€μ κ·Έκ²μμ μμλλ ν΄λμ€λ€λ§μ΄ κΈ°λ₯μ μ¬μ©(adapt)ν μ μλ€. Smalltalkμμ μ격ν νκ²μ¬(Strong Typeing) μ‘΄μ¬ μμΌλ©΄, class κ° Adapterμμ Adapteeλ‘ λ³΄λ΄μ΄μ§λ λ©μΈμ§λ₯Ό 보λΌμ μλ μ΄μ Adapteeκ° μ΄λ ν ν΄λμ€λΌλ μκ΄μμ κ²μ΄λ€.
DeleteMe ) λ§μ΄ μ΄μν΄μ μ°¨ν μμ --μλ―Ό
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λΌκ³ λΆλ₯Έλ€.
μ΄μ²λΌ 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: μμμλ κ°μκ±Έ ν΄ν μ μλ€.
λ°λ©΄μ μ΄ν리μΌμ΄μ λͺ¨λΈ μ€νμ νΈλ€μ μΌλ°μ μΌλ‘ λ€μν λͺ¨μ΅μ νλμ κ°μ 보λ€λ κ°μ§κ³ μλ€. κ·Έκ²λ€μ΄ νλμ λͺ¨μ΅μΌλ‘ ννλμ§λ§, λͺ¨λΈ κ°μ²΄λ€μ 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λΆλΆμμ κ·Έκ²μ μ νν μν λ°©λ²μ λ³Όκ²μ΄λ€.