Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 107 additions & 0 deletions nari/6.커맨드패턴.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# 호출 캡슐화하기 : 커맨드 패턴

# 만능 IOT 리모컨

- 리모컨의 각 슬롯마다 on/off 버튼이 있고, 이 슬롯에 연결된 가전 제품 제어하기

# 필요성

- 제어해야 하는 기기가 많고, 그 기기들의 공통 인터페이스는 존재하지 않음
- 앞으로 이런 클래스가 더 추가될 수 있음

# 커맨드 패턴이란

- 작업을 요청하는 쪽과 작업을 처리하는 쪽을 분리할 수 있음
- 리모컨에서 작업을 요청하면 업체에서 제공한 클래스가 그 작업을 처리
- 디자인에 커맨드 객체를 추가해서 커맨드 객체가 특정 객체에 관한 특정 작업 요청을 캡슐화
- 버튼마다 커맨드 객체를 저장해두면 사용자가 버튼을 눌렀을 때 커맨드 객체로 작업을 처리 가능
- 이 패턴을 쓰면 커맨드 객체를 버튼 슬롯에 로드할 수 있는 API를 만들어서 아주 간단한 리모컨 코드만으로도 원하는 일을 쉽게 처리할 수 있음

# 음식 주문 과정

- 주문서는 주문 내용을 캡슐화
- 종업원은 주문서를 받고 OrderUp 메소드를 호출
- 주방장은 식사를 준비하는 데 필요한 정보를 가지고 있음

=> 어떤 것을 요구하는 객체와 그 요구를 받아들이고 처리하는 객체를 분리하는 패턴

# 객체마을 식당과 커맨드 패턴

- 커맨드 객체에서 제공하는 메소드는 execute()하나
=> 이 메소드는 행동을 캡슐화하며 리시버에 있는 특정 행동을 처리

```java
public void execute {
receiver.action1();
// action -> 리시버
receiver.action2();
}
```

```java
// 클라이언트
createCommandObject()

// 인보커
setCommand()

// 커맨드
execute()
```

- 인보커 로딩
- 클라이언트에서 커맨드 객체 생성
- setCommand 를 호출해서 인보커에 커맨드 객체를 저장
- 나중에 클라이언트에서 인보커에게 그 명령을 실행하라고 요청

# 첫 번째 커맨드 객체 만들기

## 커맨드 인터페이스 구현

```java
public interface Command {
public void execute();
}
```

## 조명을 켤 때 필요한 커맨드 클래스 구현

```java
public class LightOnCommand implements Command {
Light light;

public LightOnCommand(Light light){
// 생성자에 이 커맨드 객체로 제어할 특정 조명의 정보가 전달
// 그 객체는 light라는 인스턴스 변수에 저장이 됨.
// execute 메소드가 호출되면 light 객체가 바로 그 요청의 리시버가 됨
this.light = light;
}

public void execute() {
light.on();
}
}
```

# 커맨드 객체 사용하기

```java
public class SimpleRemoteControl {
Command slot;
public SimpleRemoteControl() {}

public void setCommand(Command command) {
slot = command;
}

public void buttonWasPressed() {
slot.execute()
; }
}
```

# 커맨드 패턴의 정의

- 커맨드 패턴을 사용하면 요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화 할 수 있음
- 이러면 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있음
- 커맨드 객체는 일련의 행동을 특정 리시버와 연결하여 요청을 캡슐화 한 것.