Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch14. 자바 입출력(8) - 직접 코딩해보기 본문

JAVA 문법

Ch14. 자바 입출력(8) - 직접 코딩해보기

밍응애 2021. 2. 21. 20:44

--> Decorator와 실제 Component가 모두 하나의 클래스에서 상속을 받아서 같은 Operation이 제공된다는 것이 중요

 

 

--> 우유, 모카시럽, 휘핑크림은 커피가 아닌 데코레이터!

 

# Coffee 추상 클래스 (Component)

package Ch14.stream.coffee;

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

--> 여기서 Operation()은 brewing()메서드

 

# KenyaAmericano 클래스 (Concrete Component)

package Ch14.stream.coffee;

public class KenyaAmericano extends Coffee{

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

}

 

# EtiopiaAmericano 클래스 (Concrete Component)

package Ch14.stream.coffee;

public class EtiopiaAmericano extends Coffee{

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

}

 

# Decorator 추상클래스 (Decorator)

package Ch14.stream.coffee;

public abstract class Decorator extends Coffee{

	Coffee coffee;
	public Decorator(Coffee coffee) {
		this.coffee = coffee;
	}
	
	@Override
	public void brewing() {
		coffee.brewing();
		
	}
	
}

--> 생성자의 인자로 Coffee 객체를 받는 것이 중요하다

--> ConcreteComponent와 마찬가지로 Component의 Operation()인 brewing()을 오버라이딩한다

 

# Latte (Decorator)

package Ch14.stream.coffee;

public class Latte extends Decorator{

	public Latte(Coffee coffee) {
		super(coffee);
	}
	
	public void brewing() {
		super.brewing(); // 상위클래스의 제조방법 호출
		System.out.print("Adding Milk");
	}

}

 

# Mocha (Decorator)

package Ch14.stream.coffee;

public class Mocha extends Decorator{

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

 

# CoffeeTest 클래스 (메인)

package Ch14.stream.coffee;

public class CoffeeTest {

	public static void main(String[] args) {
		
		Coffee americano = new KenyaAmericano();
		americano.brewing();
		System.out.println();
		
		Coffee kenyaLatte = new Latte(new KenyaAmericano());
		kenyaLatte.brewing();
		System.out.println();
		
		Coffee KenyaMocha = new Mocha(new Latte(new KenyaAmericano()));
		KenyaMocha.brewing();
		System.out.println();
		
		Coffee etiopiaMocha = new Mocha(new Latte(new EtiopiaAmericano()));
		etiopiaMocha.brewing();
	}

}

--> 데코레이터 생성자의 인자로 또 다른 데코레이터 또는 컴포넌트가 들어올 수 있음!!

--> 실행 결과는 다음과 같다

 

Java의 IO클래스가 이러한 데코레이터 패턴을 따른다는 것 :)

'JAVA 문법' 카테고리의 다른 글

Ch11. 컬렉션 프레임워크 (2)  (0) 2021.02.22
Ch11. 컬렉션 프레임워크 (1)  (0) 2021.02.21
Ch14. 자바 입출력(7)  (0) 2021.02.21
Ch14. 자바 입출력(6)  (0) 2021.02.20
Ch14. 자바 입출력 (5)  (0) 2021.02.18