Super Coding Addict
Ch14. 자바 입출력(8) - 직접 코딩해보기 본문
--> 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 |