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λ©μΈμ§λ₯Ό μΆκ°λ§ νλ©΄ λλ κ²μ΄λ€.