해당 포스트는 "자바 객체지향 디자인 패턴", "JAVA 언어로 배우는 디자인 패턴 입문" 책의 내용을 요약한 것이다.



※커맨드 패턴

: 이벤트가 발생했을 때 실행될 기능이 다양하면서도 변경이 필요한 경우에 이벤트를 발생시키는 클래스를 변경하지 않고 재사용하고자 할 때 유용하다. 또한 코딩을 하다 보면 잦은 if 구문 때문에 소스코드가 길어지고 유지보수하기 어려워지는 데 이를 해결해준다.

 

ex)파일 열기와 저장 기능이 있는 프로그램

 

public class Pad implements ActionListener{
   private Menu file;
   private MenuItem open;
   private MenuItem save;
   
   private MenuBar bar;
   private TextArea text;
   private Frame frame;
   
   public Pad(){
      file = new Menu("File");
      open = new MenuItem("Open");
      save = new MenuItem("Save");
      bar = new MenuBar();
      text = new TextArea();
   
      file.add(open);
      file.add(save);
      
      frame = new Frame("Pad");
      frame.setMenuBar(bar);
      frame.setBounds(100,100,200,150); 
      frame.setVisible(true);
 
      addListener();
   }

   public void addListener(){
          open.addActionListener(this);
          save.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e){
         MenuItem item = (MenuItem)e.getSource();
         String str = item.getLabel();

         if(str.equals("Open")){
               open();
         }else if(str.equals("Save")){
               save();
         }
     }

     public void open() {
        FileDialog dialog = new FileDialog(frame, "Open", FileDialog.LOAD);
        dialog.show();
     }
     public void save(){
        FileDialog dialog = new FileDialog(frame, "Save", FileDialog.SAVE);
        dialog.show();
     }
}

위 코드를 보면 actionPerformed() 메서드에 if 구문이 있다. 위에는 단지 저장, 열기 기능만 있으나 기본적인 메모장 프로그램을 보면 새로 파일, 다른 이름으로 저장, 종료 등이 있다. 그러면 actionPerformed() 메서드의 if문 구조는 방대해 질수 밖에 없고 프로그램을 유지보수하기 힘들어진다. 이럴 때 Command 패턴을 사용한다.

 

public interface Command{
   public void execute();
}

 

public class OpenMenuItem extends MenuItem implements Command
{
   private Frame frame;
   public OpenMenuItem(String s, Frame frame){
           super(s);
           this.frame = frame;
   }
   public void execute() {
           FileDialog dialog = new FileDialog(frame, "Open", FileDialog.LOAD);
           dialog.show();
   }
}
public class SaveMenuItem extends MenuItem implements Command
{
   private Frame frame;
   public SaveMenuItem(String s, Frame frame){
           super(s);
           this.frame = frame;
   }
   public void execute() {
           FileDialog dialog = new FileDialog(frame, "Open", FileDialog.SAVE);
           dialog.show();
   }
}
 publicvoid actionPerformed(ActionEvent e){
     Command com = (Command)e.getSource();
     com.execute();
}

커맨드 패턴을 적용할 시 actionPerformed() 메서드의 if 구문이 사라지고 위와 같이 간단하게 변경된다. 기존 저장, 열기 기능 외에 다른 기능을 추가해도 이벤트가 발생하는 클래스에서 코드의 수정이 필요없다.

'자바 > 디자인패턴' 카테고리의 다른 글

템플릿 메서드 패턴  (0) 2017.07.04
중재자(Mediator) 패턴  (0) 2017.07.04
상태(State) 패턴  (0) 2017.07.03
싱글턴(Singleton) 패턴  (0) 2017.07.03
스트래티지(Strategy, 전략) 패턴  (0) 2017.07.01

+ Recent posts