Pluggable Selector ¶
๊ฐ์ฅ ๊ฐ๋จํ๊ฒ Pluggable Behavior๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์คํ๋ ํ๋์ ์ ์ฅํด๋๋ ๊ฒ์ด๋ค. ๋จผ์ ์ด๊ฒ์ ๋ฐ๋ก, ์ฆ ์๋ธํด๋์ฑ ํ๊ฒ์ ๋ณด์.
~cpp class ListPane { public: Type printElement(Object& anObject) { return anObject.printString(); } }; class DollarListPane : public ListPane { public: Type printElement(Object& anObject) { return anObject.asDollarFormatString(); } }; class DiscriptionListPane : public ListPane { public: Type printElement(Object& anObject) { return anObject.desription(); } };
์ด๋ฐ์์ผ๋ก ํ๋์ ๋ฉ์๋๋ง ๊ณ์ ์ค๋ฒ๋ผ์ด๋ฉํ๋ค๋ฉด ์๋ธํด๋์ค๋ค์ ๊ฐ์น๊ฐ ์์๊ฒ ๊ฐ๋ค. ์ฌ์ด ํด๊ฒฐ์ฑ
์ ListPane ์ค์ค๋ก๋ฅผ ์ข ๋ ์ ์ฐํ๊ฒ ๋ง๋๋ ๊ฒ์ด๋ค. ๋ค๋ฅธ ์ธ์คํด์ค๋ค์ด ๋ค๋ฅธ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๊ฒ ํ๋ ๊ฒ์ด๋ค.
์ ์ฐ์ฑ : P.S๋ ์์ ๊ฐ์ฒด์ ๊ตฌํ๋์ด์ผ ํ๋ค.
ํ์ฅ์ฑ : ํ ์ค๋ธ์ ํธ๋ง๋ค ์ต๋ ๋๋ฒ๊น์ง๋ง ์ฐ์. ๋ ๋ง์ด ์ฐ๋ฉด ํ๋ก๊ทธ๋จ์ ์๋๊ฐ ํ๋ ค์ง๋ค. ๋ ๋ง์ด ์ฐ๊ณ ์ถ์ผ๋ฉด State Object๋ฅผ ์ฐ๋ ๋ฒ์ด ์๋ค.
~cpp class ListPane { private: void (ListPane::*printMessage)(); public: Type printElement(Object& anObject) { return anObject.perform(printMessage); } void initialize() { printMessage = printString; // printString์ ์ด๋๊ฐ์ ๊ตฌํ๋์ด ์๋ค. } };๊ฐ๋ ์ฑ : ๊ทธ๋ฅ ์๋ธํด๋์ฑํ๊ฒ๋ณด๋ค ๋จ์ด์ง๋ค.
์ ์ฐ์ฑ : P.S๋ ์์ ๊ฐ์ฒด์ ๊ตฌํ๋์ด์ผ ํ๋ค.
ํ์ฅ์ฑ : ํ ์ค๋ธ์ ํธ๋ง๋ค ์ต๋ ๋๋ฒ๊น์ง๋ง ์ฐ์. ๋ ๋ง์ด ์ฐ๋ฉด ํ๋ก๊ทธ๋จ์ ์๋๊ฐ ํ๋ ค์ง๋ค. ๋ ๋ง์ด ์ฐ๊ณ ์ถ์ผ๋ฉด State Object๋ฅผ ์ฐ๋ ๋ฒ์ด ์๋ค.
์คํ๋ selector๋ฅผ ๊ฐ์ง๋ ๋ณ์๋ฅผ ์ถ๊ฐํ๋ค. ์ด๋ฆ ๋ค์ Message๋ฅผ ๋ง๋ถ์ธ๋ค. selector๋ฅผ ์คํํ๊ธฐ ์ฝ๊ฒ ํด์ฃผ๋ Composed Method๋ฅผ ๋ง๋ ๋ค.
์๋ฅผ ๋ค์ด, ์ด๋ค ๋น์ฅฌ์ผํ ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฅธ ๊ฒ์ ์๋์ ์ธ ๋ถ๋ถ์ ์์น์ํค๊ณ ์ถ๋ค๋ฉด, ์๋์ ์ธ ์์น๋ฅผ ๋ง๋ค์ด์ฃผ๋ Pluggable Selector๋ฅผ ์ฌ์ฉํ ์ ์๋ค.(???)
~cpp class RelativePoint { public: static RelativePoint* centered(Figure& aFigure) { RelativePonit* rp = new RelativePoint; rp->setFigurenMessage(aFigure, center); } void setFigurenMessage(Figure& aFigure, int aSymbol()) { figure = aFigure; locationMessage = aSymbol; } };์ด์ ์ผ๋ฐ Point์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
~cpp Point RelativePoint::asPoint() { return figure.perform(locationMessage); } Point RelativePoint::x() { return asPoint().x(); }์ด๋ฐ ์์ผ๋ก ํ๋ฉด CenteredRelativePoint, TopLeftRelativePoint๊ฐ์ ์๋ธํด๋์ค๋ฅผ ๋ง๋ค ํ์๊ฐ ์๋ค. ์์์ center๋ผ๋ ๋ฉ์ธ์ง๋ฅผ ์ถ๊ฐํ ๊ฒ์ฒ๋ผ, topLeft๋ฉ์ธ์ง๋ฅผ ์ถ๊ฐ๋ง ํ๋ฉด ๋๋ ๊ฒ์ด๋ค.