본문 바로가기
프로그래밍/디자인패턴

자바 데커레이터(Decorator) 패턴

by 방구석개발자 2022. 11. 15.
반응형

설명

Decorator 뜻은 장식으로 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴입니다.

객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴입니다.

왜 사용해야 하는지

상속을 통한 기능의 확장은 각 기능별로 클래스를 추가해야하는 단점이 있습니다.

각 추가 기능별로 개별적인 클래스를 설계하고 기능을 조합할 때 각 클래스의 객체 조합을 이용하면 됩니다.

그리하여 이 설계는 추가 기능의 수가 많을수록 효과가 좋습니다.

예시

까페 레시피를 프린트하는 프로그램을 만들어 보겠습니다.

 

먼저 커피 재료를 리턴하는 메서드를 지닌 인터페이스를 만듭니다.

public interface Coffee {

    String recipe();
}

 

그다음 커피데코레이터 추상클래스를 만듭니다.(커피를 상속하고 위임하였습니다.)

public abstract class CoffeeDecorator implements Coffee {

    private Coffee coffee;

    public CoffeeDecorator(Coffee coffee) {
        this.coffee = coffee;
    }

    @Override
    public String recipe() {
       return this.coffee.recipe();
    }
}

 

커피데코레이터를 상속받은 에스프레소, 아메리카노, 라떼, 바닐라라떼 클래스를 만듭니다.

public class Espresso implements Coffee {

    @Override
    public String recipe() {
        return "에스프레소";
    }
}

public class Americano extends CoffeeDecorator {
    public Americano(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String recipe() {
        return super.recipe() + " + 물";
    }
}

public class Latte  extends CoffeeDecorator {
    public Latte(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String recipe() {
        return super.recipe() + " + 우유";
    }
}

public class VanillaLatte extends CoffeeDecorator {

    public VanillaLatte(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String recipe() {
        return super.recipe() + " + 바닐라시럽";
    }
}

 

이제 레시피를 출력해보겠습니다.

public class Client {

    public static void main(String[] args) {
        System.out.print("에스프레소 레시피: ");

        Coffee espresso = new Espresso();
        System.out.println(espresso.print());

        System.out.print("아메리카노 레시피: ");
        Coffee americano = new Americano(new Espresso());
        System.out.println(americano.print());

        System.out.print("라떼 레시피: ");
        Coffee latte = new Latte(new Espresso());
        System.out.println(latte.print());

        System.out.print("바닐라라떼 레시피: ");
        Coffee vanillaLatte = new VanillaLatte(new Latte(new Espresso()));
        System.out.println(vanillaLatte.print());
    }
}

 

실행 결과

 

hdcd_source_java_designpattern_gof/ch02/src/com/my/pattern/decorator at master · lsm7179/hdcd_source_java_designpattern_gof

 

GitHub - lsm7179/hdcd_source_java_designpattern_gof: 자바로 보는 디자인 패턴 스터디 및 공부

자바로 보는 디자인 패턴 스터디 및 공부. Contribute to lsm7179/hdcd_source_java_designpattern_gof development by creating an account on GitHub.

github.com

프록시 패턴 vs 데코레이터 패턴

프록시 패턴과 데코레이터 패턴 구현은 비슷한데요.

프록시 패턴의 경우 실제 객체에 대한 접근을 제어하는데 초점이 맞춰져 있습니다.

데코레이터 패턴은 기존 객체의 기능을 확장하는데 초점을 맞추고 있습니다.

 

감사합니다.

반응형

'프로그래밍 > 디자인패턴' 카테고리의 다른 글

자바 커맨드(Command) 패턴  (0) 2022.12.12
자바 전략 패턴  (0) 2022.11.03
자바 프록시 패턴  (0) 2022.11.01
자바 빌더 패턴  (0) 2022.10.30
자바 팩토리 메서드 패턴  (0) 2022.10.25

댓글