Java/디자인패턴

Decorator Pattern

Bubbles 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

 

 

 

🍦 기타 주의점 

  • 데코레이터를 끼워 넣어도 클라이언트가 데코레이터를 사용하고 있음을 모른다는 것이 장점이다.
    •  따라서 특정 형식에 의존하는 코드에 데코레이터 그냥 적용하면 이 장점을 살릴 수 없음
  • 구성 요소 인스턴스를 꽤 많은 데코레이터로 감싸야 하는 경우가 있음
  • 잡다한 클래스가 너무 많아질 수도 있음