본문 바로가기
CS

데커레이터 (Decorator Pattern) 패턴

by 너츠너츠 2022. 8. 8.

데커레이터 패턴은 기본 기능에 추가할 수 있는 기능의 종류가 많을 경우에 각 추가 기능을 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

댓글