복습

커맨드 패턴(Command Pattern) 본문

CS/Design Pattern

커맨드 패턴(Command Pattern)

ykm1256 2023. 4. 5. 17:53

커맨드 패턴(Command Pattern)

  • 하나의 객체를 통해 여러 객체들에 명령(Command)을 해야할 때 사용되는 패턴
  • 요청을 캡슐화 하여 커맨드 객체가 명령을 해야하는 객체들에 대한 의존성을 느슨하게 한다.

커맨드 패턴의 구조

  • Command
    • 실행될 기능에 대한 인터페이스
    • 실행될 기능을 execute 메서드로 선언함
  • ConcreteCommand
    • 실제로 실행되는 기능을 구현
    • 즉, Command라는 인터페이스를 구현함
  • Invoker
    • 기능의 실행을 요청하는 호출자 클래스
  • Receiver
    • ConcreteCommand에서 execute 메서드를 구현할 때 필요한 클래스
    • 즉, ConcreteCommand의 기능을 실행하기 위해 사용하는 수신자 클래스

예시

만능 버튼

  • Button 클래스의 생성자로 Lamp 객체를 전달한다.
  • pressed 메서드가 호출되면 전달받은 Lamp 객체의 turnOn()메서드를 호출하여 불을 켠다

문제점

  • Button 클래스는 Lamp 객체 하나만 다룰 수 있다.
  • 따라서 버튼을 다른 기능으로 변경하거나, 기능을 추가하려면 기존 코드를 수정해야 하므로 OCP에 위배된다.

해결책

  • 이를 해결하기 위해서는 기능을 직접 구현하는 대신 실행될 기능을 캡슐화해야 한다.

  • Button은 Command의 execute 메서드를 호출한다.
  • 이때 Command는 command 인터페이스를 구현한 LampOnCommand 또는 AlarmStartCommand 클래스이다.
  • 각 클래스에서는 execute 메서드를 구현하여 램프를 켜거나, 알람이 동작하도록 한다.
  • 따라서 각 클래스의 메서드가 호출되어 불이 켜지거나 알람이 울리게 된다.
이렇게 Command 패턴을 사용하게 되면 Button 클래스를 수정하지 않고, Command 인터페이스를 구현한 새로운 command를 만들어 다양한 동작을 처리할 수 있다.

전략 패턴 VS 커맨드 패턴

  • 전략 패턴어떻게(HOW) 동작을 수행하냐에 중점을 두고
  • 커맨드 패턴무엇을(WHAT) 동작하냐에 중점을 둔다.
  • 전략 패턴무엇을 할 것인지는 정해져 있고, 그것을 어떻게 할지에 대한 유연성을 고려하며 구한다. 인터페이스의 메소드에 직접적으로 의존하게 되어, 해당 메소드의 파라미터들에 강하게 영향을 받는다.
  • 커맨드 패턴무엇을 할 것인지에 초점을 둔다. 어떻게 할건지는 외부에서 정의하여 주입하고, 그것을 실행하는 것이 더 중요하다.