복습
커맨드 패턴(Command Pattern) 본문
커맨드 패턴(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) 동작하냐에 중점을 둔다.
- 전략 패턴은 무엇을 할 것인지는 정해져 있고, 그것을 어떻게 할지에 대한 유연성을 고려하며 구한다. 인터페이스의 메소드에 직접적으로 의존하게 되어, 해당 메소드의 파라미터들에 강하게 영향을 받는다.
- 커맨드 패턴은 무엇을 할 것인지에 초점을 둔다. 어떻게 할건지는 외부에서 정의하여 주입하고, 그것을 실행하는 것이 더 중요하다.
'CS > Design Pattern' 카테고리의 다른 글
프로토타입 패턴(Prototype Pattern) (0) | 2023.11.02 |
---|---|
노출 모듈 패턴(Revealing Module Pattern) (0) | 2023.04.05 |
옵저버 패턴(Observer Pattern) (0) | 2023.03.29 |