-
Decorator PatternJava/디자인패턴 2024. 1. 11. 17:39
🍦 Decorator Pattern
- 객체에 추가 요소를 동적으로 더할 수 있는 디자인 패턴
- 서브 클래스 만들 때보다 훨씬 유연하게 기능을 확장할 수 있음
- 데코레이터의 슈퍼 클래스는 자신이 장식하고 있는 객체의 슈퍼 클래스와 동일 ~ 원래 객체에 들어갈 자리에 데코레이터 넣어도 상관 X
- 힌 객체를 여러 개의 데코레이터로 감쌀 수 있음
- 객체는 언제든지 감쌀 수 있음, 실행중에 필요한 데코레이터를 마음대로 적용 가능
- 객체 구성(인스턴스 변수로 다른 객체 저장하는 방식) 사용 ~ 첨가물을 다양하게 추가해도 유연성을 잃지 않도록
예시 ) 커피 주문
public abstract class Beverage { String description = "제목 없음"; public String getDescription() { return description; } public abstract double cost(); } // 데코레이터 public abstract class CondimentDecorator extends Beverage { Beverage beverage; public abstract Stromg getDescription; } // 음료 public class Espresso extends Beverage { public Espresso() { description = "에스프레소"; } public double cost() { return 1.9; } } // 첨가물 public class Mocha extends CondimentalDecorator { public Mocha(Beverage beverage) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", 모카"; } public double cost() { return beverage.cost() + .20; } } Beverage beverage = new DarkRoast(); beverage = new Mocha(beverage); beverage = new Whip(beverage);
🍦 또 다른 예시 - Java IO
- InputStream : 추상 구성 요소
- FileInputStream (바이트까지는 데코레이터에 감싸이는 구상 구성 요소)
- StringBufferInputStream
- ByteArrayInputStream
- FileInputStream (추상 데코레이터)
- BufferedInputStream (구상 데코레이터들)
- DataInputStream
🍦 기타 주의점
- 데코레이터를 끼워 넣어도 클라이언트가 데코레이터를 사용하고 있음을 모른다는 것이 장점이다.
- 따라서 특정 형식에 의존하는 코드에 데코레이터 그냥 적용하면 이 장점을 살릴 수 없음
- 구성 요소 인스턴스를 꽤 많은 데코레이터로 감싸야 하는 경우가 있음
- 잡다한 클래스가 너무 많아질 수도 있음
'Java > 디자인패턴' 카테고리의 다른 글
Factory Pattern (0) 2024.01.17 Observer Pattern (0) 2024.01.04