반응형
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 |