728x90
반응형
Decorator Pattern 의 다른 예제
기존의 포스팅했던 Decorator Pattern입니다. 개념이나 다른 예제를 원하시는 분은 참고하시면 좋을 것 같습니다.
Decorator Pattern Car Example
[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 |