기능 추가 확장
기존 클래스(뼈대)는 유지하고, 필요한 형태로 추가적으로 꾸밀 때 사용
확장이 필요한 경우 → 상속의 대안으로 활용
SOLID 중 개방 폐쇄 원칙(OCP), 의존 역전 원칙(DIP)
아우디라는 자동차 브랜드가 차 레벨에 따라 가격을 추가한다
상위 레벨로 올라 갈수록 가격을 추가되는 것을 데코레이터 패턴으로 구현
전체 모든 자동차 >>> 아우디, 벤츠, BMW 등등...
어떤 브랜드의 자동차더라도 가격은 존재하기 때문에, 자동차의 가격을 인터페이스로 추상화
ICar
public interface ICar {
int getPrice();
void showPrice();
}
아우디 브랜드의 가격을 설정할 수 있는 메서드 작성
Audi
// 기본 뼈대 구조
public class Audi implements ICar{
private int price;
public Audi(int price) {
this.price = price;
}
@Override
public int getPrice() {
return 0;
}
@Override
public void showPrice() {
System.out.println("audi 의 가격은 " + this.price + "원 입니다.");
}
}
각 레벨 클래스에 일정 가격을 추가
AudiDecorator
public class AudiDecorator implements ICar {
protected ICar audi;
protected String modelName;
protected int modelPrice;
public AudiDecorator(ICar audi, String modelName, int modelPrice) {
this.audi = audi;
this.modelName = modelName;
this.modelPrice = modelPrice;
}
@Override
public int getPrice() {
return audi.getPrice() + modelPrice; // A3, A4, A5 등급별로 가격 상승(+modelPrice)
}
@Override
public void showPrice() {
System.out.println(modelName + "의 가격은 " + getPrice() +"원 입니다.");
}
}
데코레이터를 상속받음
A3
public class A3 extends AudiDecorator{
public A3(ICar audi, String modelName) {
super(audi, modelName, 1000);
}
}
public class A4 extends AudiDecorator{
public A4(ICar audi, String modelName) {
super(audi, modelName, 2000);
}
}
public class A5 extends AudiDecorator{
public A5(ICar audi, String modelName) {
super(audi, modelName, 3000);
}
}
ICar audi = new Audi(1000);
audi.showPrice();
// 기존 가격에서 등급을 하나씩 추가하는 decorator
// a3
ICar audi3 = new A3(audi, "A3");
audi3.showPrice(); // 1000
// a4
ICar audi4 = new A4(audi, "A4");
audi4.showPrice(); // 2000
// a5
ICar audi5 = new A5(audi, "A5");
audi5.showPrice(); // 3000