Adapter pattern
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Adapter pattern

ÀÎÅÍÆäÀ̽º°¡ ÀÏÄ¡ÇÏÁö ¾Ê´Â Ŭ·¡½º¸¦ ÇÔ²² ¿î¿ëÇØ¾ß ÇÏ´Â °æ¿ì¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ºñ±³Àû °£´ÜÇÑ ÆÐÅÏÀ¸·Î °¢°¢ÀÇ class¸¦ ¼öÁ¤ÇÏÁö ¾Ê°í ÇÔ²² ¿î¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.
ÀÌ ÆÐÅÏ¿¡´Â ´ÙÀ½ÀÇ °´Ã¼µéÀÌ Á¸ÀçÇÑ´Ù.
  • Adaptee : ¿øÇÏ´Â ±â´ÉÀ» °¡Áö°í ÀÖ´Â °´Ã¼
  • Client : AdapteeÀÇ ±â´ÉÀ» »ç¿ëÇÒ·Á´Â »ç¿ëÀÚ °´Ã¼
  • Adapter : ClientÀÇ ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°í AdapteeÀÇ ¿øÇÏ´Â ±â´ÉÀ» ±¸ÇöÇÑ °´Ã¼
Adapter patternÀº Object Pattern°ú Class pattern µÎ°¡Áö ¹æ¹ýÀ¸·Î ±¸Çö°¡´ÉÇÏ´Ù.

Object Pattern ¹öÀü

ObjectAdapter.png

Client´Â AdapteeÀÇ methodB¸¦ »ç¿ëÇÏ°í ½Í´Ù. ±×·±µ¥, Client¿Í Adapter¸ðµÎ ±¸ÇöÀÌ ³¡³­ »óÅ - ȤÀº ¶óÀ̺귯¸®¸¸ °¡Áö°í Àְųª -·Î Ŭ·¡½º¸¦ ¼öÁ¤ÇÒ ¼ö ¾ø´Ù. ´ë½Å Áß°£¿¡ Client¿Í ȣȯµÇ´Â ÀÎÅÍÆäÀ̽º¸¦ °¡Áø Adapter¸¦ µÐ´Ù. ÀÌ È£È¯µÇ´Â ¸Þ¼­µå¸¦ client°¡ È£ÃâÇϸé, Adapter´Â AdapteeÀÇ methodB¸¦ È£ÃâÇÏ°Ô µÈ´Ù. ÀÌ·¸°Ô ÇØ¼­ ±âÁ¸ Ŭ·¡½ºÀÇ ¼öÁ¤¾øÀÌ Client¿¡¼­ AdapteeÀÇ ±â´ÉÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

ÁýÇÕ°ü°è¸¦ ÀÌ¿ëÇÑ »õ·Î¿î °´Ã¼¸¦ µÎ´Â ¹æ½ÄÀ¸·Î, Object Pattern À̶ó°í ÇÑ´Ù.
  Client     Adapter      Adaptee  
 +-----+     +------+     +-----+ 
 |     |---> >      |---) )     | 
 |     |---> >      |---) )     | 
 +-----+     +------+     +-----+ 
 Adapter´Â Client¿Í Adaptee¿¡ ȣȯµÇ´Â Interface¸¦ ¸ðµÎ °¡Áö°í -ÁýÇÕ- ÀÖ´Ù. 
 

µðÀÚÀÎ ÆÐÅÏÀ» »ý¼ºÇÏ´Â ¹æ¹ýÁß °´Ã¼ ÇÕ¼ºÀ» ÀÌ¿ëÇÑ ¿¹¶ó°í º¸¸é µÉ°Í °°´Ù. ´Ù¸¥ ÇѰ¡Áö ¹æ¹ýÀº Ŭ·¡½º ÇÕ¼ºÀε¥, ¾Æ·¡¿¡ ¼³¸íÇÑ´Ù.

Class Pattern ¹öÀü

C++ÀÇ ´ÙÁß»ó¼ÓÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ¿©±â¿¡¼­ Adapter´Â Adaptee¸¦ »ó¼Ó¹Þ¾Æ¼­ ±¸ÇöÇÒ ¼ö ÀÖ´Ù.

ClassAdapter.png

¿¹Á¦

¿Í¿ì¸¦ ÁÁ¾ÆÇÏ´Ï, ¿Í¿ìÀÇ Á÷¾÷±ºÀ¸·Î ¿¹Á¦¸¦ ¸¸µé¾î ºÃ´Ù. ¿Í¿ì¿¡¼­ °¡Àå Áß¿äÇÑ Á÷¾÷À̶ó°í ÇÏ¸é ¿ª½Ã ÆÄƼÀÇ ¸®´õÀÌÀÚ ¸ö»§ÀÎ Fighter¿Í Fighter¿Í ÆÄƼÀÇ ÇǸ¦ Ã¥ÀÓÁ® ÁÖ´Â healerÀÏ °ÍÀÌ´Ù. - Âü°í·Î ³ª´Â õ¹Î ³É²Û. ±×·¡µµ ºÎ»ç·É°üÀ̶ó´Â. ¸»Ç»¸®¿Â¼­¹ö µå¶ó°í³Ê¸¦ ã¾ÆÁÖ¼¼¿ä.-

Fighterµµ Çǰ¡ ¾øÀ»¶§¿¡´Â ºØ´ëÁú·Î ÇǸ¦ ä¿ï ¼ö ÀÖ±â´Â Çѵ¥, Èú·¯ÀÇ healing ¸¶¹ý¿¡ ºñÇØ¼­´Â ±× È¿À²¼ºÀÌ ´ë´ÜÈ÷ ¶³¾îÁú ¼ö ¹Û¿¡ ¾ø´Ù.

±×·¡¼­ Fighter¿¡°Ô Èú·¯ÀÇ 1 level Èú¸µ ´É·ÂÀ» ¼±»çÇϱâ·Î Çß´Ù. ¿Í¿ìÀúÀÇ ÀÔÀå¿¡¼­´Â Fighter¿¡°Ô ¸¶¹ýÀÌ »ý¼ÒÇÒ ¼ö ÀÖ°ÚÁö¸¸, D&D·ê °°Àº °æ¿ì¿¡¸¸ ºÁµµ Fighter Class°¡ ¸¶¹ýÀ» ¹è¿ì´Â °ÍÀ» ±ÝÁöÇϰí ÀÖÁö´Â ¾Ê´Ù. Á» È¿À²ÀÌ ¶³¾îÁ®¼­ ±×·¸Áö..

ÀÌÁ¦ Fighter¿¡°Ô Èú·¯ÀÇ cure ´É·ÂÀ» Áà¾ß Çϴµ¥.. À½ ÀÌ°Ô ÀÎÅÍÆäÀ̽º°¡ ´Ù¸¥°Ô Á» ¹®Á¦´Ù. Adapter PatternÀ» ÀÌ¿ëÇϸé, ÀÌ ¹®Á¦¸¦ Ç® ¼ö ÀÖÀ» °Í °°´Ù.

Object pattern ¹öÀü

ÀÌ°Ç Object pattern ¹öÀüÀÇ ÄÚµå´Ù.
#include <iostream> 
 
using namespace std; 
 
/* 
 ÀÀ±Þ»óÀÚ Å¬·¡½º 
 ¿©±â¿¡´Â ºØ´ë¿Í ºØ´ë°¨±â¸¦ À§ÇÑ OperationÀÌ Æ÷ÇԵǾî ÀÖÀ» °ÍÀÌ´Ù. 
*/ 
class AidKit 
{ 
 
}; 
 
class Fighter  
{ 
    private: 
    public: 
    // ¿ø·¡ Àü»ç´Â ºØ´ë¸¦ ÀÌ¿ëÇØ¼­ Ä¡·áÇÒ ¼ö ¹Û¿¡ ¾ø¾úÁö¸¸.. 
        virtual void cure(AidKit *) = 0; 
        virtual void attack() = 0; 
        virtual void defense() = 0; 
        void myClass(){cout << "I'm fighter" << endl;} 
}; 
 
class Healer 
{ 
    public: 
        void healing(int Level) { 
            cout << "Level : " << Level << "Healing ½ÃÀü" << endl; 
        } 
        void magic_attack(); 
        void magic_defense(); 
}; 
 
class AdvFighter : public Fighter 
{ 
    private : 
        Healer *heal; 
        int healLevel;  
    public: 
        AdvFighter(Healer *h) { 
            heal = h; 
            healLevel = 1; 
        } 
        void attack(){cout << "Attack !!!" << endl;}; 
        void defense(){cout << "Defense !!!" << endl;}; 
        void setHealLevel(int lev) { 
 
        } 
        // ·¹º§¾÷ µÇ¸é¼­, Èú·¯ÀÇ healing ¸¶¹ýÀ» ¾µ ¼ö ÀÖ°Ô µÇ¾ú´Ù. 
        // 1 level ÀÌÁö¸¸ À̰͸¸ ÇØµµ °¨»ç °¨»ç. 
        // ±âÁ¸ÀÇ ºØ´ëÁú ½ºÅ³Àº ±×´ë·Î µÐä, »õ·Î¿î ½ºÅ³À» Ãß°¡Çصµ µÈ´Ù.  
        void cure(AidKit *) 
        { 
            heal->healing(healLevel); 
        } 
        void healing() 
        { 
            heal->healing(healLevel); 
        } 
        int getHealLevel() 
        { 
            return healLevel; 
        } 
}; 
 
int main(int argc, char **argv) 
{ 
    Healer *myHealer; 
    AidKit *myKit; 
    AdvFighter *healFighter = new AdvFighter(myHealer); 
    healFighter->myClass(); 
    healFighter->cure(myKit); 
    healFighter->healing(); 
    healFighter->attack(); 
} 
 

Class Pattern ¹öÀü

C++ÀÇ ´ÙÁß»ó¼ÓÀ» ÀÌ¿ëÇØ¼­ ±¸ÇöÇß´Ù.
// ...Àü·« 
class Fighter  
{ 
    private: 
    public: 
        virtual void cure(AidKit *) = 0; 
        virtual void attack() = 0; 
        virtual void defense() = 0; 
        void myClass(){cout << "I'm Fighter" << endl;} 
}; 
 
class Healer 
{ 
    public: 
        void healing(int Level) { 
            cout << "Level : " << Level << "Healing ½ÃÀü" << endl; 
        } 
        void magic_attack(); 
        void magic_defense(); 
}; 
 
class AdvFighter : public Fighter, private Healer 
{ 
    private : 
        int healLevel;  
    public: 
        AdvFighter() { 
            healLevel = 1; 
        } 
        void cure(AidKit *) { 
            Healer::healing(healLevel); 
        } 
        void attack(){}; 
        void defense(){}; 
}; 
 
int main() 
{ 
    AdvFighter *myFighter = new AdvFighter; 
    AidKit *myKit; 
    myFighter->myClass(); 
    myFighter->cure(myKit); 
    return 0; 
} 
 

generic Adapter pattern

ÅÛÇø´À» ÀÌ¿ëÇÑ generic adapter patternÀÌ°Ç µû·Î ¹®¼­¸¦ ¸¸µé¾î¼­ Á¤¸®Çغ¼ »ý°¢ÀÓ.

À̱ÛÀº joinc ºí·Î±×·Î ¹ßÇàµÇ¾ú½À´Ï´Ù. ´ñ±ÛÀº ºí·Î±×¿¡¼­ ÀÔ·ÂÇÒ ¼ö ÀÖ½À´Ï´Ù.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.