본문 바로가기
언어/JAVA

데코레이터 패턴

by step 1 2021. 5. 23.
반응형

Decorator Pattern

  • 자바의 입출력 스트림은 decorator pattern이다
  • 여러 decorator들을 활용하여 다양한 기능을 제공
  • 상속보다 유연한 구현 방식
  • 데코레이터는 다른 데코레이터나 또는 컴포넌트를 포함해야 함
  • 지속적인 기능의 추가와 제거가 용이함
  • decorator와 component는 동일한 것이 아님(기반 스트림 클래스가 직접 읽고 쓸 수 있음, 보조 스트림은 추가적인 기능 제공)

 

커피만들기

Decorator Pattern을 활용하여 커피를 만든다

아메리카노

카페 라떼 = 아메리카노 + 우유

모카 커피 = 아메리카노 + 우유 + 모카시럽

크림 올라간 모카커피 = 아메리카노 + 우유 + 모카시럽 + whipping cream

 

커피는 컴포넌트고, 우유, 모카시럽, whipping cream은 모두 데코레이터이다

 

예제(Decorator 부분이 중요)

Coffee.java

package ch66;

public abstract class Coffee {

	public abstract void brewing();
}

Decorator.java

package ch66;

// 상속을 위한 상위 클래스
public abstract class Decorator extends Coffee{

	Coffee coffee;
	
	public Decorator(Coffee coffee) {
		// TODO Auto-generated constructor stub
		this.coffee = coffee;
	}
	@Override
	public void brewing() {
		// TODO Auto-generated method stub
		coffee.brewing();
	}

	
}

EtiopiaAmericano.java

package ch66;

public class EtiopiaAmericano extends Coffee{

	@Override
	public void brewing() {
		// TODO Auto-generated method stub
		System.out.println("Etiopia Americano");
	}

	
}

KeyaAmericano.java

package ch66;

public class KeyaAmericano extends Coffee{

	@Override
	public void brewing() {
		// TODO Auto-generated method stub
		System.out.println("Keya Americano");
		
	}

	
}

Latte.java

package ch66;

public class Latte extends Decorator {

//	상위클래스에 기본 생성자가 없기 때문에 구현
	public Latte(Coffee coffee) {
		super(coffee);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void brewing() {
		// TODO Auto-generated method stub
		super.brewing();
		System.out.println("Adding milk");
	}
}

Mocha.java

package ch66;

public class Mocha extends Decorator{

	public Mocha(Coffee coffee) {
		super(coffee);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void brewing() {
		// TODO Auto-generated method stub
		super.brewing();
		System.out.println("Adding Mocha syrup");
	}
}

WhippingCream.java

package ch66;

public class WhippingCream extends Decorator{

	public WhippingCream(Coffee coffee) {
		super(coffee);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void brewing() {
		// TODO Auto-generated method stub
		super.brewing();
		System.out.println("Adding Wipping Cream");
	}
}

CoffeeTest.java

package ch66;

public class CoffeeTest {

	public static void main(String[] args) {
		
		Coffee etiopiaCoffee = new EtiopiaAmericano();
		etiopiaCoffee.brewing();
		
		System.out.println();
		Coffee etiopiaLatte = new Latte(etiopiaCoffee);
		etiopiaLatte.brewing();
		
		System.out.println();
		Coffee mocha = new Mocha(new Latte(new EtiopiaAmericano()));
		mocha.brewing();
		
		System.out.println();
		Coffee keyaCoffee = new WhippingCream(new Mocha(new Latte(new EtiopiaAmericano())));
		keyaCoffee.brewing();
	}
}

반응형

'언어 > JAVA' 카테고리의 다른 글

Thread 2 (여러 메서드)  (0) 2021.05.29
Thread 1  (0) 2021.05.23
입출력 클래스(File, RandomAccessFile)  (0) 2021.05.23
DataStream, 직렬화  (0) 2021.05.23
여러가지 보조 스트림 클래스  (0) 2021.05.23