커맨드 패턴을 이해한다.

Goal

  • 커맨드 패턴의 개념을 이해한다.
  • 예시를 통해 커맨드 패턴을 이해한다.

커맨드 패턴이란

참고

예시

만능 버튼 만들기

문제점

  1. 버튼을 눌렀을 때 다른 기능을 실행하는 경우
    • 버튼을 눌렀을 때 알람이 시작되게 하려면?
      public class Alarm {
        public void start(){ System.out.println("Alarming"); }
      }
      public class Button {
        private Alarm theAlarm;
        public Button(Alarm theAlarm) { this.theAlarm = theAlarm; }
        public void pressed() { theAlarm.start(); }
      }
      
      public class Client {
        public static void main(String[] args) {
       Alarm alarm = new Alarm();
       Button alarmButton = new Button(alarm);
       alarmButton.pressed();
        }
      }
      
    • 새로운 기능으로 변경하려고 기존 코드(Button 클래스)의 내용을 수정해야 하므로 OCP에 위배된다.
    • Button 클래스의 pressed() 전체를 변경해야 한다.
  2. 버튼을 누르는 동작에 따라 다른 기능을 실행하는 경우
    • 버튼을 처음 눌렀을 때는 램프를 켜고, 두 번째 눌렀을 때는 알람을 동작하게 하려면?
      enum Mode { LAMP, ALARM };
      // Button 클래스의 코드를 수정
      public class Button {
        private Lamp theLamp;
        private Alarm theAlarm;
        private Mode theMode;
        // 생성자에서 버튼을 눌렀을 때 필요한 기능을 인지로 받는다.
        public Button(Lamp theLamp, Alarm theAlarm) {
         this.theLamp = theLamp;
         this.theAlarm = theAlarm;
        }
        // 램프 모드 또는 알람 모드를 설정
        public void setMode(Mode mode) { this.theMode = mode; }
        // 설정된 모드에 따라 램프를 켜거나 알람을 울림
        public void pressed() {
         switch(theMode) {
         case LAMP: theLamp.turnOn(); break;
         case ALARM: theAlarm.start(); break;
         }
       }
      }
      
    • 필요한 기능을 새로 추가할 때마다 Button 클래스의 코드를 수정해야 하므로 재사용하기 어렵다.

해결책

문제를 해결하기 위해서는 구체적인 기능을 직접 구현하는 대신 실행될 기능을 캡슐화해야 한다.

관련된 Post

References