데코레이터 패턴이란?
간단히 말해서 기존 뼈대 클래스는 유지하면서 필요한 형태로 꾸밀 때 사용한다.
확장이 필요한 경우 상속의 대안으로도 활용된다.
코드로 바로 확인해보자.
자동차 인터페이스를 만들어 가격을 가져오는 getPrice와 가격을 보여주는 showPrice를 구현하도록 한다.
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("아우디의 가격은 " + price + "원 입니다.");
}
}
이제 기본 아우디를 기반으로 한 데코레이터 클래스를 구현한다.
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;
}
@Override
public void showPrice() {
System.out.println(modelName+"의 가격은 "+ getPrice()+"원 입니다.");
}
}
그리고 해당 클래스를 상속받아 구현한 A3,A4,A5 모델을 구현해보자.
각각 기본 아우디 모델에서 1000원, 2000원, 3000원씩 비싸도록 설정한다.
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);
}
}
이제 위처럼 데코레이터 패턴을 적용한 결과를 main 에서 호출해보자.
/******************** 데코레이터 패턴 ***********************/
ICar audi = new Audi(1000);
audi.showPrice();
//a3
ICar audi3 = new A3(audi,"A3");
audi3.showPrice();
//a4
ICar audi4 = new A4(audi,"A4");
audi4.showPrice();
//a5
ICar audi5 = new A5(audi,"A5");
audi5.showPrice();
/******************* 결과 **************************/
아우디의 가격은 1000원 입니다.
A3의 가격은 2000원 입니다.
A4의 가격은 3000원 입니다.
A5의 가격은 4000원 입니다.
결과는 위의 토대는 그대로인 채로 추가 옵션별로 가격이 달라진 것을 볼 수 있다.
비슷한 유형의 다양한 곳에서 사용할 수 있으니 알아두도록 하자.
참고
- 패스트캠퍼스 예상국 Backend Developer님 강의(Spring초격차)
'Backend > Java' 카테고리의 다른 글
파사드 패턴(Facade Pattern) 예제 코드로 이해하기 (0) | 2022.04.03 |
---|---|
옵저버(Observer pattern)패턴 예제 코드로 이해하기 (0) | 2022.04.03 |
프록시 패턴(Proxy pattern) 예제 코드로 이해하기 (0) | 2022.04.03 |
어댑터 패턴(Adapter Pattern)예제 코드로 이해하기 (0) | 2022.03.08 |
싱글톤 패턴(Singleton Pattern) 예제 코드로 이해하기 (0) | 2022.03.08 |