데커레이터 패턴은 기본 기능에 추가할 수 있는 기능의 종류가 많을 경우에 각 추가 기능을 Decorator 클래스로 정의한 후 필요한 Decorator 객체를 조합함으로써 추가 기능을 설계하는 방식입니다.
예를 들어 요리하는 기구의 기능이 삶다, 튀기다, 굽다, 찌다라는 4개의 기능이 있을 경우 총 15가지의 조합이 가능해집니다. 이 조합을 모두 하나의 객체를 상속받게 되면 15개의 객체가 되어 너무 많은 객체가 만들어집니다.
따라서 이런 부분들을 조합에 따라 객체를 만드는 것이 아닌 Decorator 객체로 각 기능을 만들어 조합하는 방식으로 가는 것이 더 효율적입니다.
// Cut, Steam, Fry, Grill
abstract class Cook {
public abstract void show();
}
class CookMethod extends Cook {
public void show() {
System.out.println("요리를 하다");
}
}
abstract class CookDecorator extends Cook {
private Cook decoratedCook;
public CookDecorator(Cook decoratedCook) {
this.decoratedCook = decoratedCook;
}
public void show() {
decoratedCook.show();
}
}
class CutDecorator extends CookDecorator {
public CutDecorator(Cook decoratedCook) {
super(decoratedCook);
}
public void show() {
super.show();
cut();
}
public void cut() {
System.out.println("자르다");
}
}
class SteamDecorator extends CookDecorator {
public SteamDecorator(Cook decoratedCook) {
super(decoratedCook);
}
public void show() {
super.show();
steam();
}
public void steam() {
System.out.println("찌다");
}
}
class FryDecorator extends CookDecorator {
public FryDecorator(Cook decoratedCook) {
super(decoratedCook);
}
public void show() {
super.show();
fry();
}
public void fry() {
System.out.println("튀기다");
}
}
class GrillDecorator extends CookDecorator {
public GrillDecorator(Cook decoratedCook) {
super(decoratedCook);
}
public void show() {
super.show();
grill();
}
public void grill() {
System.out.println("굽다");
}
}
class Client {
public static void main(String[] args) {
Cook food = new CookMethod();
String decoratorName = "cut";
if (decoratorName.equals("cut")) {
food = new CutDecorator(food);
} else if (decoratorName.equals("steam")) {
food = new SteamDecorator(food);
} else if (decoratorName.equals("fry")) {
food = new FryDecorator(food);
} else {
food = new GrillDecorator(food);
}
food.show();
}
}
반응형
'CS' 카테고리의 다른 글
팩토리 메서드 패턴 (0) | 2022.08.17 |
---|---|
템플릿 메서드 패턴 (Template Method Pattern) (0) | 2022.08.12 |
옵저버 패턴 (Observer Pattern) (0) | 2022.08.02 |
커맨드 패턴 (Command Pattern) (0) | 2022.07.27 |
스테이트 패턴 (0) | 2022.07.22 |
댓글