데코레이터 패턴
- 객체에 동적으로 새로운 책임(장식) 을 추가하는 디자인 패턴
- 코드의 유연성 부여가능
- 원본 객체에 여러 가지 장식을 덧입힐 수 있음.
프록시 패턴과 차이
- 프록시
- 목적
- 제어의 흐름 변경
- 별도의 로직 처리
- 클라이언트가 받는 반환값을 특별한 경우가 아니면 변경 X
- 목적
- 데코레이터
- 클라이언트가 받는 반환값에 장식을 더함
클래스 다이어그램과 시퀀스 다이어그램
- 프록시와 데코레이터는 클래스 다이어그램 , 시퀀스 다이어그램에서 유사한 구조를 가질 수 있음.
- 하지만, 프록시
- 원래의 반환값 전달
- 데코레이터
- 반환값 자체에 변화
라는 점이 다르다.
코드
public interface IService {
public abstract String runSomething();
}
public class Service implements IService {
@Override
public String runSomething() {
return "서비스 짱";
}
}
public class Decoreator implements IService {
IService iService;
@Override
public String runSomething() {
System.out.println("호출에 대한 흐름 제어가 주목적, 반환 결과에 장식을 더하여 전달");
iService = new Service();
return "정말 " + iService.runSomething();
}
}
public class ClientWithDecolator {
public static void main(String[] args) {
IService decorator = new Decoreator();
System.out.println(decorator.runSomething());
}
}
- 메서드 일치 (프록시와 같음)
- 실제 서비스와 같은 이름의 메서드 구현.
- 일반적으로 인터페이스 사용
- 참조 변수 보유(프록시와 같은)
- 데코레이터는 내부에 실제 서비스 객체에 대한 참조 변수 (합성)
- 메서드 호출과 장식 (여기가 다름)
- 장식자는 실제 서비스 메서드 호출
- 반환값에 장식을 더해 클라이언트에게 반환
- 추가 로직
- 실제 서비스의 메서드 호출 전후에 추가적인 로직 수행
메서드 호출의 반환값에 변화를 주기 위한 디자인 패턴임
Uploaded by N2T
'자바 > 스프링입문객체지향' 카테고리의 다른 글
[6단원]디자인 패턴 - 어댑터 패턴 (0) | 2023.09.15 |
---|---|
[6단원]디자인 패턴 - 프록시 패턴 (0) | 2023.09.15 |
[5단원]5원칙 - LSP (0) | 2023.09.13 |
[5단원]5원칙 - ISP (0) | 2023.09.13 |
[5단원]5원칙 - DIP (0) | 2023.09.13 |