Decorator pattern
- 상속의 대안으로 활용
- 기존 클래스는 유지하고, 이후 필요한 형태로 꾸밀 때 사용
- SOLID 중에서 개방패쇄원칙(OCP)와 의존역전원칙(DIP)을 따름
- 에스프레소 + 다른 재료 = 다른 커피
예제코드 (자동차 등급에 따라 가격이 달라짐)
인터페이스와 자동차들
public interface ICar {
int getPrice();
void showPrice();
}
public class Audi implements ICar {
private int price;
public Audi(int price){
this.price = price;
}
@Override
public int getPrice(){
return price;
}
@Override
public void showPrice(){
System.out.println("audi의 가격은 "+ this.price+"원 입니다.");
}
}
실행코드
- 데코레이션 패턴 적용전
public class Main { public static void main(String[] args){ ICar audi = new Audi(1000); audi.showPrice(); // 데코레이션 패턴 적용전으로 1000 원이 출력됨. } }
데코레이터 패턴 구현
Decorator
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 this.audi.getPrice()+this.modelPrice;
}
@Override
public void showPrice(){
System.out.println(this.modelName+"의 가격은 "+ getPrice() +"원 입니다.");
}
}
Decorator 상속받은 모델 객체
A3
public class A3 extends AudiDecorator{
public A3(ICar audi, String modelName){
super(audi, modelName, 1000);
}
}
A4
public class A4 extends AudiDecorator{
public A4(ICar audi, String modelName){
super(audi, modelName, 2000);
}
}
A5
public class A5 extends AudiDecorator{
public A5(ICar audi, String modelName){
super(audi, modelName, 3000);
}
}
실행코드
-
데코레이션 패턴 적용 후 ```java public class Main {
public static void main(String[] args){ ICar audi = new Audi(1000); audi.showPrice(); // 데코레이션 패턴 적용전으로 1000 원이 출력됨.
// 등급 a3 ICar a3 = new A3(audi,"A3"); a3.showPrice(); // 등급 a4 ICar a4 = new A4(audi,"A4"); a3.showPrice(); // 등급 a5 ICar a5 = new A5(audi,"A5"); a3.showPrice(); }
} ```
Comments