Java Decorator pattern

Codren·2021년 6월 6일
0

Section 1. 데코레이터 패턴

1. 데코레이터 패턴 (Decorator pattern)

객체의 결합을 통해 기능을 동적으로 확장하는 패턴으로 기본 기능추가 기능인 Decorator 객체를 결합하는 기법

  • 자바의 입출력 스트림은 decorator pattern
  • 데코레이터는 다른 데코레이터나 또는 컴포넌트를 포함해야 함




2. 컴포넌트와 데코레이터의 구조

  • 포함 관계 (Aggregation) - A 클래스에서 B 클래스의 인스턴스를 멤버 변수로 가짐 (A <>→B)
  • 원본 데코레이터는 컴포넌트의 Operation() 을 수행
  • 확장 데코레이터는 원본 데코레이터의 Operaiont()을 수행하고 자신의 행동 수행




3. 컴포넌트 클래스

  • 추상 클래스 Coffee
public abstract class Coffee {
	
	public abstract void brewing();
}

  • 추상 클래스 Coffee 를 상속 받은 EtiopiaAmericano
public class EtiopiaAmericano extends Coffee{

	@Override
	public void brewing() {
		System.out.print("EtiopiaAmericano ");
	}

}




4. 데코레이터 클래스

  • 추상 메서드가 없어도 abstract 지정하여 추상 클래스로 지정
public abstract class Decorator extends Coffee{

	Coffee coffee;				# 컴포넌트 인스턴스를 멤버변수로 가짐
	public Decorator(Coffee coffee){
		this.coffee = coffee;
	}
	
	@Override
	public void brewing() {
		coffee.brewing();		# 컴포넌트의 brewing() 메서드 수행
	}
}

  • 구체적으로 구현한 Latte Decorator
public class Latte extends Decorator{

	public Latte(Coffee coffee) {
		super(coffee);		# 상위 클래스에 기본 생성자가 없기 때문에 super() 호출
	}

	
	public void brewing() {
		super.brewing();				# 원본 데코레이터 수행
		System.out.print("Adding Milk ");		# 자신만의 메서드 수행
	}
}

  • 구체적으로 구현한 Mocha Decorator
public class Mocha extends Decorator{

	public Mocha(Coffee coffee) {
		super(coffee);		# 상위 클래스에 기본 생성자가 없기 때문에 super() 호출
	}

	public void brewing() {
		super.brewing();				# 원본 데코레이터 수행
		System.out.print("Adding Mocha Syrup ");	# 자신만의 메서드 수행
	}
}




5. 데코레이터를 이용한 커피 머신 프로그램

public class CoffeeTest {

  public static void main(String[] args) {
		
      EtiopiaAmericano coffee = new Mocha(new Latte(new EtiopiaAmericano()));
      coffee.brewing();
		
	}
}

##### 출력 결과 #####
EtiopiaAmericano Adding Milk Adding Mocha Syrup




6. 동작 과정

    ① Mocha 인스턴스의 coffee.brewing(); 호출
    ② super.brewing(); 호출
    ③ coffee.brewing(); 호출
    ④ Latte 인스턴스의 coffee.brewing(); 호출
    ⑤ super.brewing(); 호출
    ⑥ coffee.brewing(); 호출
    ⑦ EtiopiaAmericano 인스턴스의 brewing(); 호출
    ⑧ Latte 인스턴스의 print(Adding Milk)
    ⑨ Mocha 인스턴스의 print(Adding Mocha Syrup)

0개의 댓글