diff --git "a/nari/6.\354\273\244\353\247\250\353\223\234\355\214\250\355\204\264.md" "b/nari/6.\354\273\244\353\247\250\353\223\234\355\214\250\355\204\264.md" new file mode 100644 index 0000000..1a56c81 --- /dev/null +++ "b/nari/6.\354\273\244\353\247\250\353\223\234\355\214\250\355\204\264.md" @@ -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() +; } +} +``` + +# 커맨드 패턴의 정의 + +- 커맨드 패턴을 사용하면 요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화 할 수 있음 +- 이러면 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있음 +- 커맨드 객체는 일련의 행동을 특정 리시버와 연결하여 요청을 캡슐화 한 것.