Command Pattern
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Command Pattern

ÆÐÅϰú ÆÐÅÏ¿¡ ´ëÇÑ (UMLÀ» Æ÷ÇÔÇÑ)¼³¸í±ÛÀ» º¸¸é ¿ª½Ã »ç¿ëÇÏ´Â °Íº¸´Ù ¼³¸íÇÏ´Â°Ô ´õ ¾î·Æ±ºÀ̶ó´Â ´À³¦ÀÌ´Ù. ³» »ý°¢À» Àß ÀÌÇØÇϱ⠽±°Ô Àß Àü´ÞÇØº¸ÀÚ¶ó´Â ¸¶À½°¡ÁüÀ¸·Î °¡´ÉÇÑ ÆòÀÌÇÏ°Ô ±ÛÀ» ¸¸µé¾î ºÁ¾ß°Ú´Ù.

Command PatternÀº ÇൿÀÚü¸¦ °´Ã¼·Î º»´Ù. ÇൿÀ» °´Ã¼·Î º½À¸·Î½á Á»´õ ½±°Ô ¸í·ÉÀ» ³»¸®±â ÀüÀÇ »óÅ·Πº¹±ÍÇÒ ¼ö ÀÖ´Ù. ¹®Á¦°¡ »ý±æ¶§ ¸¶´Ù ±×¶§ ±×¶§ ÂÊÁö·Î ÀϰŸ®¸¦ ¸¸µé¾î¼­ ÁÖ´Â °æ¿ì¸¦ »ý°¢ÇØ º¸ÀÚ. ³ªÁß¿¡ ±× °á°ú¸¦ Á¤¸®ÇÏ´Â °Íµµ ¸Å¿ì º¹ÀâÇÑ ÀÏÀÌ µÉ È®·üÀÌ ³ôÀ» °ÍÀÌ´Ù. ÀÌ·¸°Ô ÇÏÁö ¾Ê°í ¹®Á¦ÀÚü¸¦ °´Ã¼·Î ¸¸µé¾î¼­, ±×·¯´Ï±î ¹®Á¦¸¦ ºÐ·ùÇÏ°í ¹­¾î¼­ ¼­·ùöÀ» ¸¸µé¾î¼­ ³Ñ±â°í °á°ú¸¦ Æ÷ÇÔÇÑ ¼­·ùöÀ» ´Ù½Ã ¹Þ°Ô µÈ´Ù¸é ¹®Á¦¿¡ ´ëÇÑ Ã³¸®°¡ ÈξÀ °£°áÇØ Áú °ÍÀÌ´Ù. ÀϹÝÀûÀÎ ¾÷¹«Ã³¸®¿¡¼­µµ ÈçÈ÷º¼ ¼ö ÀÖ´Â ¹æ½ÄÀ̱⵵ ÇÏ´Ù. Command PatternÀ̶õ Áï ¼öÇàÇØ¾ßÇÒ ¹®Á¦ ȤÀº ¸í·ÉÀ» °´Ã¼·Î ó¸®ÇÏ´Â ¹æ½ÄÀ̶ó°í Á¤Àdz»¸± ¼ö ÀÖÀ» °ÍÀÌ´Ù.

ÀÌ·¯ÇÑ Æ¯Â¡Àº ´ÙÀ½°ú °°Àº ÀÀ¿ë¿¡ À¯¿ëÇÏ´Ù.
  1. Multi-level undo
    À¯ÀúÀÇ ¸í·ÉÀ» °´Ã¼·Î ¸¸µç´Ù. ¸¸µé¾îÁø ¸í·É°´Ã¼Àº stack¿¡ À¯Áö½Ã۸é,°¡Àå ÃÖ±Ù¿¡ ½ÇÇàµÈ ¸í·ÉÀÌ °¡Àå À§¿¡ ³õÀÌ°Ô µÉ °ÍÀÌ´Ù. undo¸¦ ¿øÇÑ´Ù¸é undo() ¸Þ¼­µå¸¦ ½ÇÇà½ÃÄѼ­ popÀ» ÇÏ¸é µÈ´Ù.
  2. Progress bar
    ÇÁ·Î±×·¥¿¡°Ô ÁÖ¾îÁøÀÏÀÇ ¸í·ÉÀÇ ¿¬¼ÓÀ¸·Î ÀÌ·ç¾îÁø´Ù°í °¡Á¤ÇÑ´Ù. À̶§ °¢°¢ÀÇ ¸í·É°´Ã¼´Â getEstimatedDuration¸Þ¼­µå¸¦ °¡Áø´Ù. ÇÁ·Î±×·¥Àº ÀÌ ¸Þ¼­µå¸¦ ÀÌ¿ëÇØ¼­ ¸í·ÉÀÌ ¾î´ÀÁ¤µµ ¼öÇàµÇ¾ú´ÂÁö¸¦ ½±°Ô ÆÇ´ÜÇÒ ¼ö ÀÖ´Ù.
  3. thread pool
  4. parallel processing
  5. networking

Command_pattern.png

Command
ÀÌ ÆÐÅÏ¿¡¼­ °¡Àå Áß¿äÇÑ Å¬·¡½º´Â ¸í·ÉÀ» ¼öÇàÇϴµ¥ ÇÊ¿äÇÑ ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°í ÀÖ´Â Command°´Ã¼´Ù. ÀÏ»ó¾÷¹«¿¡¼­ÀÇ ÀÛ¾÷¿äû¼­¶ó°í º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿ì¸®°¡ ÀÌ ÆÐÅÏÀ» »ç¿ëÇÏ´Â ÀÌÀ¯´Â ¸í¼­¼¼¿¡ ÀûÇôÀÖ´Â ¸í·ÉÀ» ½ÇÇàÇÏ´Â °ÍÀ̹ǷΠ¸í·ÉÀ» ¼öÇàÇϱâ À§ÇÑ execute¸Þ¼­µå¸¦ Æ÷ÇÔÇÑ´Ù.
ConcreteCommand
Receiver°´Ã¼°¡ ¾î¶² ActionÀ» ÃëÇÒÁö¸¦ Á¤ÀÇÇÑ´Ù.
Receiver
ÁÖ¾îÁø ¿äû¿¡ ´ëÇØ¼­ ¾î¶²ÀÏÀ» ¼öÇàÇØ¾ß ÇÏ´ÂÁö¸¦ ¾Ë°í ÀÖ´Â °´Ã¼.
Invoker
¸í·ÉÀÇ ¼öÇàÀ» ¿äûÇÑ´Ù.
Client
ConcreteCommand °´Ã¼¸¦ »ý¼ºÇÑ´Ù.

¿¹Á¦

C++

°£´ÜÇÑ ¿ä¸® ÇÁ·Î±×·¥ÀÌ´Ù. Àç·á¸¦ Áغñ¸¦ À§ÇÑ Áغñ¸í·É°´Ã¼, ÁغñµÈ Àç·á¸¦ °¡Áö°í ÇÁ¶óÀÌÆÒ¿¡ ºº´ÂµîÀÇ ÀÛ¾÷À» ÇÏ´Â Çൿ¸í·É°´Ã¼°¡ ÁغñµÈ´Ù. ¿ä¸®´Â »ç¶÷ÀÌ ÇÏ´Â °Å¶ó¼­ ¶§¶§·Î ½Ç¼ö°¡ ÀÖÀ» ¼ö Àֱ⠶§¹®¿¡ Undo±â´ÉÀ» °¡Áø´Ù. Undo ±â´ÉÀº ¸í·É°´Ã¼¸¦ stack¿¡ ½×¾ÆµÎ°í popÇÏ´Â °ÍÀ¸·Î ±¸ÇöÇÒ ¼ö ÀÖ´Ù. ºü¸¥ ±¸ÇöÀ» À§Çؼ­ STLÀÇ vector¸¦ »ç¿ëÇß´Ù.

#include <iostream> 
#include <vector> 
#include <string> 
 
using namespace std; 
 
// °¡»ó¸Þ¼­µå¸¦ Æ÷ÇÔÇÑ ÀÎÅÍÆäÀ̽º ½´ÆÛ Ŭ·¡½º  
class Command{ 
  public: 
   virtual void execute(void) =0; 
   virtual ~Command(void){}; 
}; 
  
class Ingredient : public Command { 
  public: 
   Ingredient(string amount, string ingredient){ 
      _ingredient = ingredient; 
      _amount = amount; 
   } 
   void execute(void){ 
      cout << " *Add " << _amount << " of " << _ingredient << endl; 
   } 
  private: 
   string _ingredient; 
   string _amount; 
}; 
  
class Step : public Command { 
  public: 
   Step(string action, string time){ 
      _action= action; 
      _time= time; 
   } 
   void execute(void){ 
      cout << " *" << _action << " for " << _time << endl; 
   } 
  private: 
   string _time; 
   string _action; 
}; 
 
// command¸¦ ÀúÀåÇÏ°í ²¨³»±â À§ÇÑ stack Ŭ·¡½º  
class CmdStack{ 
  public: 
   void add(Command *c) { 
      commands.push_back(c); 
   } 
   void createRecipe(void){ 
      for(vector<Command*>::size_type x=0;x<commands.size();x++){ 
         commands[x]->execute(); 
      } 
   } 
   void undo(void){ 
      if(commands.size() > 0) { 
         commands.pop_back(); 
      } 
      else { 
         cout << "Can't undo" << endl; 
      } 
   } 
  private: 
   vector<Command*> commands; 
}; 
  
int main(void) { 
   CmdStack list; 
  
   //Create ingredients 
   Ingredient first("µÎ½ºÇ¬", "½Ä¿ëÀ¯"); 
   Ingredient second("¼¼ÄÅ", "½Ò"); 
   Ingredient third("ÇѽºÇ¬","ÄÉÂý"); 
   Ingredient fourth("³×È©", "Äá"); 
   Ingredient fifth("ÇѽºÇ¬", "°£Àå"); 
  
   //Create Step 
   Step step("ÈĶóÀÌÆÒ¿¡ ºº±â","3-4ºÐ Á¤µµ"); 
  
   //Create Recipe 
   cout << "ººÀ½¹äÀ» ¸¸µé¾îº¾½Ã´Ù." << endl; 
   list.add(&first); 
   list.add(&second); 
   list.add(&step); 
   list.add(&third);  
   list.undo(); 
   list.add(&fourth); 
   list.add(&fifth); 
   list.createRecipe(); 
   cout << "¿ä¸®½ÃÀÛ!" << endl; 
   return 0; 
} 
 

C

À½.. ±×´Ú °´Ã¼ÁöÇâÀûÀÌÁö ¾Ê´Ù°í »ý°¢µÇ´Â C¸¦ ÀÌ¿ëÇØ¼­µµ ±¸ÇöÇØ ºÁ¾ß °Ú´Ù. ´ÙÀ½°ú °°Àº ¿ä¼ÒµéÀÌ ÇÊ¿äÇÏÁö ¾ÊÀ»±î ½Í´Ù.±¸Á¶Ã¼¿¡ ÇÔ¼öÆ÷ÀÎÅÍ ´Ù¹ßÀ» µÎ´Â °ÍÀ¸·Î Ŭ·¡½º ºñ½ÁÇÏ°Ô ¸¸µé¾î³¾ ¼ö ÀÖ±ä ÇϰڴÙ.

PHP

¾ÖÃÊ¿¡ ÀüÇô °´Ã¼ÁöÇâÀûÀÌÁö ¾Ê°Ô ¸¸µé¾îÁ³´ø php´Â php4°¡ µÇ¾î¼­¾ß class Ű¿öµå¸¦ Á¦°øÇϱ⠽ÃÀÛÇß°í php5¿¡ À̸£·¯¼­ ±×·°Àú·° °´Ã¼ÁöÇâÀûÀÌ´Ù¶ó´Â ¾ê±â¸¦ µè°Ô µÇ¾ú´Ù. ÀÌÁ¦´Â °´Á¦ÁöÇâ ÆÐÅÏÀ» »ç¿ëÇØ¼­ ¸¸µé¾îÁø PHP ÇÁ·Î±×·¥µµ ¾î·ÆÁö ¾Ê°Ô ã¾Æº¼ ¼ö ÀÖ´Ù.
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.