Java/Design Pattern

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

noahkim_ 2024. 12. 16. 21:23

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

 

1. OCP

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

 

2. 데코레이터 패턴

  • 모든 서브클래스를 위한 필드들을 슈퍼클래스에서 가질 경우, 일부 서브클래스에서는 적합하지 않은 필드를 가져야 함
  • 이를 해결하기 위해 장식을 달고, 장식에게 위임

 

데코레이터 형식
  • 감싸는 객체의 형식과 같음 (상속을 사용해서 형식을 맞춤)

 

이점
  • 객체에 추가 요소를 동적으로 더할 수 있음
  • 여러 개의 데코레이터로 감쌀 수 있음
  • 자신이 장식하고 있는 객체에게 작업을 위임하는 일 말고도 추가 작업을 수행할 수 있음

 

3. 스타버즈

Beverage

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();
}
  • Beverage: 각 데코레이터가 감쌀 음료를 나타내는 객체

 

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