Decorator Pattern (데코레이터 패턴)

이진석·2022년 8월 24일
1
post-thumbnail

20220824

한 번에 끝내는 Java/Spring 웹 개발 마스터


1) Decorator Pattern이란?

  • 자바의 입출력 스트림은 decorator pattern이다.

  • 지속적인 기능의 추가와 제거가 용이하다.

  • 여러가지클래스를 Decorator가 포함된 클래스와 상속시키고 출력값을 다르게 설정하여 하나씩 추가해 나가는 방식이다.


2) Coffee

package ch19;

public abstract class Coffee {
	
	public abstract void brewing();
}

3) EtiopiaAmericano

package ch19;

public class EtiopiaAmerciano extends Coffee {

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

4) Decorator


package ch19;

public abstract class Decorator extends Coffee {
	
	Coffee coffee; //인자로 받고 멤버로 가지고 있게 설정
	
	public Decorator(Coffee coffee) {
		this.coffee = coffee;
	}
	
	@Override
	public void brewing() {
		
		coffee.brewing();
	}
}

5) Latte

package ch19;

public class Latte extends Decorator {
	//상위 클래스에 default costructor가 없으므로 반드시 super사용.
	
	public Latte (Coffee coffee) {
		super(coffee);
	}
	
	public void brewing() {
		super.brewing();
		System.out.println("Adding Milk");
	}
}

6) Mocha

package ch19;

public class Mocha extends Decorator {

	public Mocha(Coffee coffee) {
		super(coffee);
	}
	
	public void brewing() {
		super.brewing();
		System.out.println("Adding Mocha syrup");
	}
}

7) CoffeeTest

package ch19;

public class CoffeeTest {

	public static void main(String[] args) {

		Coffee etiopiacoffee = new EtiopiaAmerciano();
		etiopiacoffee.brewing();
		
		System.out.println();
		Coffee etiopialatte = new Latte(etiopiacoffee);
		etiopialatte.brewing();
		
		System.out.println();
		Coffee etiopiamocha = new Mocha(new Latte(etiopiacoffee));
		etiopiamocha.brewing();
	}
}

  • Decorator패턴이 적용되어있는 커피머신 프로그램이다.

  • Cofffee라는 클래스에 brewing()이라는 메소드를 넣어서 EtiopiaAmerciano클래스는 "Etiopia Americano"라는 값을 호출시 출력되게 설정하였고,

  • 추상 클래스인 Decorator클래스는 Coffee를 상속받아서, Decorator를 호출시 Coffee는 자동으로 호출될 수 있게 하였다.

  • 이후, Latte와 Mocha는 같은 원리로 Decorator클래스에 default 생성자가 존재하지 않으므로, super()를 통해서 불러왔고, 호출시 각각 Adding Milk와 Adding Mocha Syrup을 출력하게 하였다.

  • Coffee etiopialatte = new Latte(etiopiacoffee); 이런 식으로 Coffee etiopiacoffee = new EtiopiaAmerciano() 이 부분에서 이미 출력한 EtiopiaAmericano부분에 Latte클래스가 가지고 있는 brewing내부의 출력값을 추가로 표시하게 하였고, Mocha도 같은 원리이다.

profile
혼자서 코딩 공부하는 전공생 초보 백엔드 개발자 / https://github.com/leejinseok0614

0개의 댓글