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๋ถ๋ถ์์ ๊ทธ๊ฒ์ ์ ํํ ์ํ ๋ฐฉ๋ฒ์ ๋ณผ๊ฒ์ด๋ค.