독서 기록/디자인패턴

[디자인패턴] 헤드퍼스트 디자인패턴 Chap.6 (Feat.커맨드 패턴)

JoJobum 2022. 9. 28.

커맨드 패턴이란

 

request를 객체로 캡슐화하는 것이다.

예를 들어 형광등의 turnOff(), turnOn() 메소드가 있었다고 가정할 때, LightOffCommand, LightONCommand 같은 객체 형식으로 캡슐화하는 것이다.

이로서 이러한 request를 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있습니다.

 

어떤 객체(A)에서 다른 객체(B)의 메서드를 실행하려면 그 객체(B)를 참조하고 있어야 하는 의존성이 발생합니다.

그러나 커맨드 패턴을 적용하면 의존성을 제거할 수 있습니다.

위의 예시에서 이어가면 리모콘 객체에서 형광등 객체의 turnOff(), turnOn() 메소드를 사용하면 리모콘 객체와 형광등 객체 사이의 의존성이 발생한다는 것이다.

 

또한 기능이 수정되거나 변경이 일어날 때 A 클래스 코드를 수정없이 기능에 대한 클래스를 정의하면 되므로 시스템이 확장성이 있으면서 유연해집니다.

 

다른 객체별로 다양한 request를 수용해야할 때

Invoke 와 receiver를 decouple 해야할 때 사용

 

 

Client: ConcreteCommand를 생성하고 Receive를 생성한다

Invoker: 명령이 들어있으며, execute()를  호출함으로써 커맨드 객체에게 특정 작업을 수행해 달라는 요구함

Receiver:  요구 사항을 수행할 때 어떤 일을 처리해야할지 아는 객체

Command :모든 커맨드 객체에서 구현해야하는 인터페이스

ConcreteCommand : execute() 호출시 리시버에 있는 메서드 호출해서 작업 처리

 

위의 리모컨과 형광등의 예시로 이어나가면

Client는 사용자, Invoker는 리모컨, Receiver는 형광등 이 된다.

사용자(Client)가 객체화한 명령 LightOnCommand, LightOffCommand를 각각 가지고 있는 리모컨(Invoker)을 사용(execute())하여 특정 작업을 처리하도록 지시하는 방식입니다.

 

Invoker 와 receiver 는 분리되어 있지만 invoker가 receiver에게 동작할 수 있음

 

receiver를 담고 있는 커맨드를 invoker에게 탑재 => invoker가 커맨드를 실행시키면서 receiver에게 동작 수행

(직접적인 연결없이 동작 수행 가능) 

 

옵저버 패턴을 사용하면 모든 행동들을 기록해두었다가 에러 발생시 그대로 다시 실행시킬 수 있음으로 에러 복구에 유리

비슷한 느낌으로 로그 시스템이나 트랜잭션을 구현할 수 있음

반응형

댓글