반응형
학습목표
- 캡슐화를 더 높은 수준으로 끌어올려보자
- 어떻게? 메서드 호출을 캡슐화를 통해
- 메서드 호출을 캡슐화하면 계산 과정의 각 부분을 결정화할 수 있기에 계산하는 코드를 호출한 객체는 그 일이 어떤 식으로 처리되는지 전혀 신경 쓸 필요가 없다.
- 캡슐화된 메서드 호출을 로그 기록용으로 저장한다거나 재사용으로 취소 기능을 구현하는 일과 같이 스마트한 일도 할 수 있다.
커맨드 패턴이란?
- 요청 내역을 객체로 캡슐화하여 객체를 서로 다른 요청 내역에 따라 매개변수화가 가능하다.
- 이러한 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있다.
커맨드 객체
일련의 행동을 특정 리시버와 연결함으로써 요청을 캡슐화한 것이다.
그렇기에, 행동과 리시버를 하나의 객체에 넣고 execute()라는 메서드 하나만 외부에 공개하는 방법을 사용해야 한다.
execute() 메서드 요청에 따라 리시버는 일련의 작업을 처리해야 한다.
위 그림을 통해 알 수 있듯이 캡슐화가 적용되어 있기에 외부에서는 receiver가 어떤 일을 수행하는지 알 수 없다.
단지 execute() 를 호출하면 해당 요청이 처리된다는 사실만 알 수 있다.
클래스 다이어그램으로 살펴보기
해당 다이어그램을 보며 하나씩 이야기해 보면 다음과 같다.
- Client
- ConcreteCommend를 생성하고 Reciver를 설정한다.
- Invoker
- 해당부분에는 명령이 들어가 있다.
- execute() 메서드를 호출함으로써 Command 객체의 특정 직업을 수행해 달라는 요구를 하게 된다.
- Receiver
- 요구 사항을 수행할 때 어떤 일을 처리해야 하는지를 알고 있는 객체이다.
- Command
- 모든 Command 객체에서 구현해야하는 인터페이스이다.
- 이를 통해 Invoker를 매개변수화 할 수 있고, 실행 중 동적으로도 매개변수화를 설정할 수 있다.
- 모든 명령은 execute() 메서드 호출로 수행되며, 이 메서드는 Receiver에 특정 작업을 처리하라는 지시를 전달한다.
- ConcreateCommand
- 특정 행동과 리시버를 연결해준다.
- Invoker에서 execute() 호출로 요청 시 이 객체에서 리시버에 있는 메서드를 호출해 요청된 작업을 처리한다.
활용
- 작업 큐와 작업 처리 스레드
- Command를 통해 Computation의 한 부분을 패키지로 묶어 일급 객체 형태로 전달이 가능하다.
일급 객체
- 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 말한다.
- 보통 함수에 인자 넘기기, 수정, 변수 대입과 같은 연산을 지원할 때 일급 객체라고 한다.
그렇기에, 클라이언트 애플리케이션에서 커맨드 객체를 생성 후 시간이 지나도 Computation을 호출할 수 있게 되며, 다른 스레드에서 호출할 수도 있다.
- 적용 가능 사례 : 스케줄러, 스레드 풀, 작업 큐
- 트랜젝션 시스템 - store() & load()
애플리케이션에서 모든 행동을 기록해 두었다가 애플리케이션이 다운되었을 때 그 행동을 다시 호출해서 복구하는 기능은 커맨드 패턴에서 store()와 load() 메서드를 추가해서 구현할 수 있다.
- 각 커맨드가 실행될 때마다 디스크에 그 내역을 store()
- 시스템이 다운된 후에, 객체를 다시 load() → 순서대로 작업을 다시 처리
요약
- 요청하는 객체와 요청을 수행하는 객체를 분리하고 싶다면 커맨드 객체를 고려해 보자
- 요청 내역을 객체로 캡슐화해 객체를 서로 다른 요청 내역에 따라 매개변수화 할 수 있다.
- 이렇게 될 시, 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있다.
반응형
'BOOK' 카테고리의 다른 글
[Design Pattern] Factory Pattern 팩토리 패턴에 대해 알아보자! (0) | 2023.01.28 |
---|---|
[Design Pattern] Decorator Pattern 데코레이터 패턴에 대해 알아보자! (0) | 2023.01.14 |
[Design Pattern] Observer Pattern 옵저버 패턴에 대해 알아보자! (0) | 2023.01.07 |
[BOOK : 오브젝트 15장] 디자인 패턴과 프레임워크 (0) | 2022.12.18 |
[BOOK : 오브젝트 14장] 일관성 있는 협력 (0) | 2022.12.10 |