👩🏻💻 Programming/Java
[디자인패턴] Decorator pattern
한국의 메타몽
2021. 8. 8. 19:30
Decorator Pattern 이란
기존 뼈대(Class)는 유지하되, 이후 필요한 형태로 꾸밀 때 사용한다.
즉, 객체에 추가적인 요건을 동적으로 첨가한다.
SOLID중에서 개방폐쇄 원칙(OCP)과 역전 원칙(DIP)을 따른다.
쉽게 예시를 들면, 에스프레소 원액 (기존 뼈대 = Class)에 물을 첨가하면 아메리카노가 된다.
또는 우유와 시럽을 첨가하면 카페 라떼가 된다. 이와같이 기존 뼈대는 유지하되, 필요한 형태로 꾸밀때 상요하는 패턴이 Decoratr Pattern이다.
예시
자동차를 예시로 들어보자.
ICar라는 인터페이스를 정의하고, 이를 구현하는 Audi 클래스를 두고, 이로 인해 audi라는 객체가 생성됐다고 가정하자.
그런데 만약 런타임 단계에서 audi의 특징을 그대로 두고 업그레이드된 버젼인 A3, A4를 얻고싶다면 어떻게 해야할까?
방법은 다음과 같다.
[ICar]
package com.company.design.decorator;
public interface ICar {
int getPrice();
void showPrice();
}
[Audi]
package com.company.design.decorator;
public class Audi implements ICar{
private int price;
public Audi(int price){
this.price = price;
}
@Override
public int getPrice() {
return this.price;
}
@Override
public void showPrice() {
System.out.println("Audi의 가격은 " + this.price+" 원 입니다.");
}
}
ICar의 속성을 물려받은 Audi 클래스가 만들어졌다
[AudiDecorator]
package com.company.design.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 audi.getPrice() + modelPrice; // 주의. audi.getPrice()를 더했다.
}
@Override
public void showPrice() {
System.out.println(modelName + "의 가격은 " + getPrice() +" 원 입니다.");
}
}
동시에 ICar의 속성을 물려받은 AudiDecorator 클래스가 만들어졌다.
[A3, A4클래스]
// A3
package com.company.design.decorator;
public class A3 extends AudiDecorator{
public A3(ICar audi, String modelNAme){
super(audi,modelNAme, 1000);
}
}
// A4
package com.company.design.decorator;
public class A4 extends AudiDecorator{
public A4(ICar audi, String modelNAme){
super(audi,modelNAme, 2000);
}
}
마지막으로 main함수이다.
[main]
package com.company.design;
import com.company.design.decorator.A3;
import com.company.design.decorator.A4;
import com.company.design.decorator.Audi;
import com.company.design.decorator.ICar;
public class Main {
public static void main(String[] args) {
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();
}
}
결과적으로 audi의 금액을 동적으로 첨가하여 A3의 가격은 1000+1000, A4의 가격은 1000+2000이 되었다.