데코레이터 패턴

심야·2022년 11월 17일
0

웹 개발

목록 보기
20/47

데코레이터 패턴

데코레이터 패턴은 이름에 나와있듯이 원본에 장식을 더하는 패턴이다.
데코레이터 패턴은 프록시 패턴과 구현 방법이 같다. 다만 프록시 패턴은 클라이언트가 최종적으로 돌려 받는 반환값을 조작하지 않고 그대로 전달하는 반면 데코레이터 패턴은 클라이언트가 받는 반환값에 장식을 덧입힌다.

특징

  1. 장식자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다.
  2. 장식자는 실제 서비스에 대한 참조 변수를 갖는다. 즉 합성을 사용한다.
  3. 장식자는 실제 서비스의 같은 이름을 가진 메서드를 호출하고, 그 반환값에 장식을 더해 클라이언트에게 돌려준다.
  4. 장식자는 실제 서비스 메서드 호출 전후에 별도 로직을 수행할 수도 있다.

Example

인터페이스

public interface IService {
    public abstract String runSomething();
}

서비스

public class Service implements IService{
    @Override
    public String runSomething() {
        return " 서비스 짱!!";
    }
}

데코레이터

public class Decorator implements IService{
    IService service;

    public String runSomething(){
        System.out.println("호출에 대한 장식 주목적, 클라이언트에게 반환 결과에 장식 더해 전달");

        service = new Service();
        return "정말" + service.runSomething();
    }
}

클라이언트


public class ClientWithDecorator {
    public static void main(String[] args) {
        IService Decorator = new Decorator();
        System.out.println(Decorator.runSomething());
    }
}

실행 결과

호출에 대한 장식 주목적, 클라이언트에게 반환 결과에 장식 더해 전달
정말 서비스 짱!!

실행 결과에서 알 수 있듯이 서비스의 서비스 짱 결과에 호출에 대한 장식 주목적, 클라이언트에게 반환 결과에 장식 더해 전달 문자열을 데코레이팅해 출력한다.

적용 예시

  1. 데코레이터 패턴은 객체들을 사용하는 코드를 훼손하지 않으면서 런타임에 추가 행동들을 객체들에 할당할 수 있어야 할 때 사용한다.
  2. 데코레이터는 비즈니스 로직을 계층으로 구성하고, 각 계층에 데코레이터를 생성, 런타임에 로직의 다양한 조합들로 객체들을 구성할 수 있도록한다. 모든 객체가 공통 인터페이스를 따르기 때문에 클라이언트 코드는 모든 객체를 같은 방식으로 다룰 수 있다.
  3. 데코레이터 패턴은 상속을 사용하여 객체 행동을 확장하는 것이 어색하거나 불가능할 때 사용한다.
  4. final 클래스는 상속 즉, 확장이 불가능하다. final 클래스를 재사용하려면 데코레이터 패턴을 사용해 클래스를 자체 래퍼로 래핑한다.

장단점

  1. 새로운 하위 클래스를 만들지 않고도 객체를 확장할 수 있다.
  2. 런타임에 객체들에서부터 책임들을 추가하거나 제거할 수 있다.
  3. 객체를 여러 데코레이터로 래핑해 여러 행동들을 합성할 수 있다.
  4. 단일 책임 원칙. 다양한 행동들의 여러 변형들을 구현하는 모놀리식 클래스를 여러 개의 작은 클래스들로 나눌 수 있다.
  5. 래퍼들의 스택에서 특정 래퍼를 제거하기 어렵다.
  6. 데코레이터 스택 내의 순서에 의존하지 않는 방식으로 데코레이터를 구현하기 어렵다.
  7. 계층들의 초기 설정 코드가 보기 흉할 수 있다.

출처

디자인 패턴에 뛰어들기
스프링 입문을 위한 객체지향의 원리와 이해

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글