커맨드 패턴 정의
- 이벤트가 발생했을 때 실행될 기능이 다양하면서 변경이 필요한 경 우 이벤트를 발생시키는 클래스의 변경없이 재사용하고자 할 때
- 기술적정의: 실행될 기능을 캡슐화 함으로써 기능의 실행 요구하는 호출자 클래스(Invoker)와 실제 기능을 실행하는 수신자 클래스(Receiver, ex.Lamp)사이의 의존서을 제거한다. 따라서 기능의 변경에도 호출자 클래스를 수정없이 사용 가능
- 버튼이 눌렸을때 수행 될 기능을 캡슐화
- 기존의 코드는 OCP를 위배함 따라서 Command라는 인터페이스를 생성해서 새로운 기능이 추가되도 버튼에는 코드가 추가되지않는다.
커팬드 패턴 예시
실습
인보커 로딩 순서
- 클라이언트 커맨드 객체 생성
- SetCommand() 호출
- 클라이언트에서 인보커에서 명령 요청
실습 예제 그림 설명
위 그림을 토대로 코드를 짜면 아래와 같다
코드
SimpleRemoteControl 클래스
public class SimpleRemoteControl {
Command slot;
public SimpleRemoteControl() {}
//슬롯을 가지고 제어할 명령을 설정하는 메소드
//리모컨 버튼의 기능을 바꾸고 싶다면 이 메소드를 변경
public void setCommand(Command command) {
slot = command;
}
//버튼을 누르면 이 메소드가 호출됨
//지금 슬롯에 연결된 커맨드 객체의 execute() 메소드만 호출하면 됨
public void buttonWasPressed() {
slot.execute();
}
}
Command 인터페이스
public interface Command {
public void execute();
}
LightOnCommand 구현 클래스
public class LightOnCommand implements Command {
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.on();
}
}
LightOffCommand는 같은 방식이라 따로 구현안했다
Light 클래스
public class Light {
public void on() {
System.out.println("조명이 커졌습니다.");
}
public void off() {
System.out.println("조명이 꺼졌습니다.");
}
}
RemoteControlTest
public class RemoteControlTest {
//커맨트 패턴에서 클라이언트 해당하는 부분
public static void main(String[] args) {
//인보커 역할(필요한 작업을 요청할 때 사용할 커맨드 객체를 인자로 전달)
SimpleRemoteControl remote = new SimpleRemoteControl();
Light light = new Light();
//커맨드 객체를 생성하고 리시버를 전달
LightOnCommand lighton = new LightOnCommand(light);
//커맨드 객체를 인보커에게 전달
remote.setCommand(lighton);
//실제 리모컨 버튼을 누름
remote.buttonWasPressed();
}
}
커맨드 인터페이스를 토대로 한개의 구현클래스만 구현해놨다. 리모컨 버튼에 작동을 추가하고 싶은
사물, 기능이 있다면 Light처럼 클래스 추가후에 커맨드를 구현하는 새로운 커맨드 클래스를 만들면
된다.(ex. Alarm클래스 만들고 AlarmStartCommand만드는식으로 말이다)
참조
- https://leveloper.tistory.com/156
- JAVA 객체 지향 디자인 패턴(저자: 정인상, 채홍석)
'디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 템플릿 메서드 패턴 (1) | 2023.12.01 |
---|---|
[디자인패턴] 데커레이터 패턴 (0) | 2023.12.01 |
[디자인패턴] 옵저버 패턴 (0) | 2023.10.31 |
[디자인패턴]빌더 패턴 (0) | 2023.10.12 |
[디자인패턴]싱글톤(Singleton)패턴 (0) | 2023.10.03 |