Java/Design Pattern

[헤드퍼스트 디자인 패턴] 3. 데코레이터 패턴

noahkim_ 2024. 12. 16. 21:23

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다

 

1. OCP (Open/Closed Principle) 

  • 새로운 행동을 추가하여 확장
  • 기존 코드를 수정 필요 없음

 

2. 데코레이터 패턴

  • 클래스에 기능을 추가할 때, 상속이 아닌 객체를 감싸는 방식으로 확장하는 구조
항목 설명
상속의 문제점
- 슈퍼클래스에 모든 기능을 넣으면 → 일부 서브클래스에는 불필요하거나 부적절한 기능까지 상속됨
- 기능 변경 시 상속 구조 전체에 영향 발생
 해결 방법
- 기능을 데코레이터 객체로 분리
- 원래 객체를 감싸고, 필요한 기능만 동적으로 위임하여 확장
형식
- 데코레이터 클래스는 원래 객체와 동일한 인터페이스 또는 슈퍼클래스를 구현
- 따라서 감싼 객체처럼 사용 가능
이점
- 기능을 동적으로 추가 가능
- 여러 데코레이터 중첩 사용 가능
- 위임 + 부가 작업 수행 가능 (기능을 덧붙이거나 변형 가능)

 

3. 예제: 스타버즈

Beverage (Base)

더보기
public abstract class Beverage {
    private String descript;
    
    public String getDescript() { return descript; }
    
    public abstract double cost();
}
public class Espresso extends Beverage {
    public Espresso() { descript = "에스프레소"; }
    
    public double cost() { return 1.99; }
}
public class HouseBlend extends Beverage {
    public HouseBlend() { descript = "하우스 블렌드 커피"; }
    
    public double cost() { return .89; }
}

 

Condiment (Decorator)

더보기
public abstract class CondimentDecorator extends Beverage {
    private Beverage beverage;
    
    public abstract String getDescript();
}
public class Mocha extends CondimentDecorator {
	public Mocha(Beverage beverage) { this.beverage = beverage; }
	
    public String getDescript() { return beverage.getDescript() + ", 모카"; }
    public double cost() { return beverage.cost() + .02; }
}

 

4. 대표적인 예

  • java.io