JAVA

[Java] Decorator Pattern - Example Car

lakelight 2022. 8. 1. 19:07
728x90
반응형

Decorator Pattern 의 다른 예제

기존의 포스팅했던 Decorator Pattern입니다. 개념이나 다른 예제를 원하시는 분은 참고하시면 좋을 것 같습니다.

 

[Java] Decorator Pattern

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

lakelight.tistory.com

 

Decorator Pattern Car Example

 

Diagram

 

[Car interface]

package Java.decoratorEx;

public interface Car {

    int getPrice();

    void showPrice();

}
Car interface를 생성했고 차의 가격 데이터를 가져오는 getPrice()와 차의 가격을 출력해주는 showPrice()를 만들어 주었습니다.

 

[Benz class]

package Java.decoratorEx;

public class Benz implements Car{

    private int price;

    public Benz(int price) {
        this.price = price;
    }

    @Override
    public int getPrice() {
        return price;
    }

    @Override
    public void showPrice() {
        System.out.println("Benz 의 가격은 " + this.price + "원 입니다.");
    }
}
저는 벤츠를 좋아하기 때문에 Benz class를 생성하였습니다. 필드 변수로 price를 만들었고, 생성자를 통해 필드 변수의 값을 설정해주었습니다. 그리고 Car interface를 상속하여 Car interface에 있는 메서드들을 재정의 해주었습니다.

 

[BenzDecorator class]

package Java.decoratorEx;

public class BenzDecorator implements Car{

    protected Car benz;
    protected String modelName;
    protected int modelPrice;

    public BenzDecorator(Car benz, String modelName, int modelPrice) {
        this.benz = benz;
        this.modelName = modelName;
        this.modelPrice = modelPrice;
    }

    @Override
    public int getPrice() {
        return benz.getPrice() + modelPrice;
    }

    @Override
    public void showPrice() {
        System.out.println(modelName + "의 가격은 " + getPrice() + " 원 입니다.");
    }
}
차 등급별로 가격을 다르게 출력하는 기능을 만들기 위해 BenzDecorator class를 생성해주었고, 생성자를 통해 모델 이름과, 모델의 추가되어야하는 가격을 받았습니다. 또한 Car interface를 상속해서 메서드를 오버라이드하였습니다.

 

[BenzC class]

package Java.decoratorEx;

public class BenzC extends BenzDecorator{
    public BenzC(Car benz, String modelName) {
        super(benz, modelName, 20_000_000);
    }
}
각각의 C클래스 E클래스 S클래스에 따라 데코레이터를 상속받아와서 생성자를 통해 추가된 모델이름과 모델의 추가가격에 대한 내용을 추가해주었습니다.

 

[BenzE class]

package Java.decoratorEx;

public class BenzE extends BenzDecorator{
    public BenzE(Car benz, String modelName) {
        super(benz, modelName, 40_000_000);
    }
}

 

[BenzS class]

package Java.decoratorEx;

public class BenzS extends BenzDecorator{
    public BenzS(Car benz, String modelName) {
        super(benz, modelName, 100_000_000);
    }
}

 

[Decorator Main]

package Java.decoratorEx;

public class DecoratorMain {
    public static void main(String[] args) {
        Car benz = new Benz(200_000_000);
        benz.showPrice();

        //C Class
        Car benzC_Class = new BenzC(benz, "C_Class");
        benzC_Class.showPrice();
        //E Class
        Car benzE_Class = new BenzE(benz, "E_Class");
        benzE_Class.showPrice();
        //S Class
        Car benzS_Class = new BenzS(benz, "S_Class");
        benzS_Class.showPrice();
    }
}
Main 메서드에서 각 차의 등급의 따라 생성자를 통해 데코레이터를 상속받은 각각의 객체들을 생성해주었고, 아래에서 출력 결과를 확인하실 수 있습니다.

 

결과

Benz 의 가격은 200_000_000원 입니다.
C_Class의 가격은 220_000_000 원 입니다.
E_Class의 가격은 240_000_000 원 입니다.
S_Class의 가격은 300_000_000 원 입니다.

 

결론

초기에 Benz 클래스만 만들어서 코드를 사용하다가 모델과 모델별로 추가가격을 설정하고 싶을 때
위에 처럼 Decorator를 활용한다면 코드의 변화 없이 기능을 확장할 수 있을 것입니다.

이 개념을 차나 아메리카노 뿐 아니라 많은 사례에서 적용해본다면 효율적으로 코드를 구성할 수 있을 것입니다.
OCP와 DIP를 지키는 Decorator를 효율적으로 사용한다면 훌룡한 개발자로 성장할 수 있을 것 같습니다.

 

728x90
반응형

'JAVA' 카테고리의 다른 글

[Java] Facade Pattern  (0) 2022.08.01
[Java] Observer Pattern  (0) 2022.08.01
[Java] Proxy Pattern - AOP  (0) 2022.07.31
[Java] Proxy Pattern  (0) 2022.07.31
[Java] Adapter Pattern  (0) 2022.07.31