1. 데코레이터 패턴이란?
데코레이터 패턴이란 말그대로 장식을 하는 패턴이다.
쉽게 말하자면 기본기능이 있고 그 기능에 추가적인 기능들을 수행하고자 할때 사용하면된다.
예를 들어 맥도날드 햄버거 가격을 계산해주는 시스템이 있다고 생각해보자.
맥도날드에는 다양한 메뉴들이 존재한다.
치즈버거, 빅백, 콜라, 치킨텐더, 감자튀김 등등 이러한 메뉴들의 조합에 대해서 가격을 산정하려면 과연 어떻게 구현하는게 가장 깔끔할까?
클래스 멤버변수로 각 메뉴의 가격을 두고 조합을 하는 방법이 있겠지만 추가적인 메뉴가 추가된다면 기존 클래스 변경이 불가피하다.
혹은 새로운 클래스를 만들어도 될것이다. 하지만 메뉴가 늘어나고 조합이 늘어남에 따라 추가적으로 수많은 클래스들이 생겨날 것이다.
이러한 경우 데코레이터 패턴을 한번 고려해 볼 만한다.
데코레이터 패턴을 사용하면 기존 클래스를 수정하지 않고 복잡하지 않게 확장 시킬 수 있다.
2. 클래스 구조도
3. 예제
/**
* Component
*/
public interface Bugger {
public int getTotalPrice();
}
/**
* ConcreteComponent
*/
public class BasicBugger implements Bugger{
private int price = 5000;
@Override
public int getTotalPrice() {
return getPrice();
}
public int getPrice() {
return price;
}
}
/**
* Decorator
*/
abstract public class BuggerDecorator implements Bugger {
}
/**
* ConcreteDecoratorA
*/
public class ChickenTender extends BuggerDecorator {
private Bugger bugger;
private int price = 2000;
public ChickenTender(Bugger bugger) {
this.bugger = bugger;
}
public int getPrice() {
return price;
}
@Override
public int getTotalPrice() {
return bugger.getTotalPrice() + getPrice();
}
}
/**
* ConcreteDecoratorB
*/
public class CocaColar extends BuggerDecorator {
private Bugger bugger;
private int price = 1500;
public CocaColar(Bugger bugger) {
this.bugger = bugger;
}
public int getPrice() {
return price;
}
@Override
public int getTotalPrice() {
return bugger.getTotalPrice() + getPrice();
}
}
/**
* ConcreteDecoratorC
*/
public class FrenchFries extends BuggerDecorator{
private Bugger bugger;
private int price = 1000;
public FrenchFries(Bugger bugger) {
this.bugger = bugger;
}
public int getPrice() {
return price;
}
@Override
public int getTotalPrice() {
return bugger.getTotalPrice() + getPrice();
}
}
public class Main {
public static void main(String[] args) {
// 무한한 조립이 가능하다.
// 메뉴 1번, 기본버거 + 코카콜라
System.out.println("메뉴 1번, 기본버거 + 코카콜라");
Bugger bugger = new CocaColar( new BasicBugger());
System.out.println(bugger.getTotalPrice());
// 메뉴 2번, 기본버거 + 감자튀김
System.out.println("메뉴 2번, 기본거버 + 감자튀김");
bugger = new FrenchFries( new BasicBugger());
System.out.println(bugger.getTotalPrice());
// 메뉴 3번, 기본버거 + 치킨텐더
bugger = new ChickenTender( new BasicBugger());
System.out.println("메뉴 3번, 기본거버 + 치킨텐더");
System.out.println(bugger.getTotalPrice());
// 메뉴 4번, 기본버거 + 코카콜라 + 감자튀김 + 치킨텐더
bugger = new CocaColar( new FrenchFries( new ChickenTender( new BasicBugger())));
System.out.println("메뉴 4번, 기본버거 + 코카콜라 + 감자튀김 + 치킨텐더");
System.out.println(bugger.getTotalPrice());
}
}
4. 실행결과
'프로그래밍 > Java' 카테고리의 다른 글
[JAVA] 자바로 파일 읽고/쓰기에 대해 알아 보자 (0) | 2020.04.08 |
---|---|
Html으 PDF로 변경하는 방법 (0) | 2020.03.13 |
[자바/JAVA] 디자인패턴 #6 빌더( Builder) 패턴 (0) | 2019.01.06 |
[자바/프로그램] 폴더구조 및 파일을 똑같이 복사하는 프로그램 (0) | 2017.11.21 |
[자바/JAVA] 디자인패턴#5 생산자/소비자 패턴( Producer/Consumer Pattern) (0) | 2017.11.17 |