한줄코딩 발표 준비 210912 decorator pattern

bluesky·2021년 9월 12일
0

[1] 데코레이터 패턴이란?

  • 객체에 동적으로 새로운 책임을 추가할 수 있게 하는 패턴.
  • 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.
    이를 이용하여 OCP를 충족하는 유연한 구조를 만들수 있다.

Component

  • 기본 기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의
    즉, 클라이언트는 Component를 통해 실제 객체를 사용함

ConcreteComponent

  • 기본 기능을 구현하는 클래스

Decorator

  • 많은 수가 존재하는 구체적인 Decorator의 공통 기능을 제공

ConcreteDecoratorA, ConcreteDecoratorB

  • Decorator의 하위 클래스로 기본 기능에 추가되는 개별적인 기능을 뜻함

예시코드

public class StarbuzzCoffee {
 
	public static void main(String args[]) {
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() 
				+ " $" + beverage.cost());
 
		Beverage beverage2 = new DarkRoast();
		beverage2 = new Mocha(beverage2);
		beverage2 = new Mocha(beverage2);
		beverage2 = new Whip(beverage2);
		System.out.println(beverage2.getDescription() 
				+ " $" + beverage2.cost());
 
		Beverage beverage3 = new HouseBlend();
		beverage3 = new Soy(beverage3);
		beverage3 = new Mocha(beverage3);
		beverage3 = new Whip(beverage3);
		System.out.println(beverage3.getDescription() 
				+ " $" + beverage3.cost());
	}
}

구조

[2] 사용법 예시.

커피 예시.

자바 I/O

  1. InputStream : 추상 구성요소
  2. FileInuptStream : 구상 구성요소
  3. FilterInputStream : 추상 데코레이터
  4. PushbackInputStream, Buffered InputStream : 구상 데코레이터 역할

[3] 주의사항.

  • 특정 형식에 의존하는 코드에 사용하기 어려움
    *ex) 특정 구상 구성요소인지 확인한 다음 어떤 작업을 처리하는 경우.

  • 자잘한 클래스가 너무 많이 추가될 수 있음.(ex) 자바 I/O)

  • 데코레이터를 도입하면 구성요소를 초기화하는데 필요한 코드가 복잡해질수 있는 단점이 있음.
    *이때 빌더 패턴(Builder Pattern), factory-pattern을 같이 사용하기도 함.

참고자료.

https://johngrib.github.io/wiki/decorator-pattern/

https://www.youtube.com/watch?v=VL9OAohbjzI

profile
SMART https://github.com/dongseoki?tab=repositories

0개의 댓글