[6단원]디자인 패턴 - 데코레이터 패턴 (Decorator Pattern)

데코레이터 패턴

  • 객체에 동적으로 새로운 책임(장식) 을 추가하는 디자인 패턴
  • 코드의 유연성 부여가능
  • 원본 객체에 여러 가지 장식을 덧입힐 수 있음.

프록시 패턴과 차이

  • 프록시
    • 목적
      • 제어의 흐름 변경
      • 별도의 로직 처리
    • 클라이언트가 받는 반환값을 특별한 경우가 아니면 변경 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());
    }
    
}
  1. 메서드 일치 (프록시와 같음)
    • 실제 서비스와 같은 이름의 메서드 구현.
    • 일반적으로 인터페이스 사용
  1. 참조 변수 보유(프록시와 같은)
    • 데코레이터는 내부에 실제 서비스 객체에 대한 참조 변수 (합성)
  1. 메서드 호출과 장식 (여기가 다름)
    • 장식자는 실제 서비스 메서드 호출
    • 반환값에 장식을 더해 클라이언트에게 반환
  1. 추가 로직
    • 실제 서비스의 메서드 호출 전후에 추가적인 로직 수행

메서드 호출의 반환값에 변화를 주기 위한 디자인 패턴임


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