JAVA

[Java] Decorator Pattern

lakelight 2022. 7. 28. 23:56
728x90
반응형

Decorator Pattern

기존 클래스는 유지하되, 이후 필요한 형태로 꾸밀 때 사용합니다. 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있습니다.
OCP와 DIP를 따릅니다. 

이미지 출처: https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html

 

Decorator Pattern Ex

커피 클래스

  • 원두 종류: Etiopia, Kenya
  • 커피 종류: Americano, Latte, Mocha, WhippingCream
원두 종류를 선택하고 커피 종류를 추가하여 새로운 커피를 만들 수 있습니다.
예를 들면 에티오피아 원두의 라떼, 케냐 원두의 모카에 휘핑크림을 올린다던지 확장하여 다양한 커피를 생성할 수 있습니다.

 

Coffee.java

package Java.decoratorPattern;

//추상 클래스로 커피 정의
public abstract class Coffee {
	//커피를 내리는 메서드를 추상메서드로 설정
    public abstract void brewing();
}

 

EtiopiaAmericano.java

package Java.decoratorPattern;

//커피를 상속한 에티오피아 원두의 커피
public class EtiopiaAmericano extends Coffee {
    @Override
    public void brewing() {
        System.out.print("Etiopia Americano");
    }
}

 

KenyaAmericano.java

package Java.decoratorPattern;

//커피를 상속한 케냐 원두의 커피
public class KenyaAmericano extends Coffee{
    @Override
    public void brewing() {
        System.out.print("Kenya Americano");
    }
}

 

Decorator.java

package Java.decoratorPattern;

public abstract class Decorator extends Coffee{

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

    @Override
    public void brewing() {
        coffee.brewing();
    }
}

 

Latte.java

package Java.decoratorPattern;

public class Latte extends Decorator{

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

    public void brewing() {
        super.brewing();
        System.out.print(" Adding Milk");
    }
}

 

Mocha.java

package Java.decoratorPattern;

public class Mocha extends Decorator{
    public Mocha(Coffee coffee) {
        super(coffee);
    }

    public void brewing(){
        super.brewing();
        System.out.print(" Adding Mocha syrup");
    }
}

 

WhippingCream.java

package Java.decoratorPattern;

public class WhippingCream extends Decorator{
    public WhippingCream(Coffee coffee) {
        super(coffee);
    }

    public void brewing(){
        super.brewing();
        System.out.println(" Adding Whipping Cream");
    }
}

 

Main.java

 

package Java.decoratorPattern;

public class Main {
    public static void main(String[] args) {
        Coffee etiopiaCoffee = new EtiopiaAmericano();
        etiopiaCoffee.brewing();

        System.out.println();
        //에티오피아 커피로 라떼 생성
        Coffee etiopiaLatte = new Latte(etiopiaCoffee);
        etiopiaLatte.brewing();

        System.out.println();
        //에티오피아 커피로 모카 생성
        Coffee etiopiaMocha = new Mocha(etiopiaCoffee);
        etiopiaMocha.brewing();

        System.out.println();
        //케냐 커피로 모카 생성하고 휘핑크림 올리기
        Coffee kenyaCoffee = new WhippingCream(new Mocha(new Latte(new KenyaAmericano())));
        kenyaCoffee.brewing();
    }
}

 

결론

객체의 기능 확장을 유연하게 할 수 있는 Decorator Pattern에 대해서 알아보았습니다.
커피 객체를 예로 들어서 다양한 커피를 만들어보는 예제를 통해
Decorator Pattern을 이해할 수 있었습니다.

 

728x90
반응형

'JAVA' 카테고리의 다른 글

[Java] Priority Thread  (0) 2022.07.29
[Java] Thread  (0) 2022.07.29
[Java] Template Method Pattern  (0) 2022.07.28
[Java] Singleton Pattern  (0) 2022.07.28
[Java] 자바 메서드가 생성되는 원리 - 가상 함수 기법  (0) 2022.07.28