한 번에 끝내는 Java/Spring 웹 개발 마스터
자바의 입출력 스트림은 decorator pattern이다.
지속적인 기능의 추가와 제거가 용이하다.
여러가지클래스를 Decorator가 포함된 클래스와 상속시키고 출력값을 다르게 설정하여 하나씩 추가해 나가는 방식이다.
package ch19;
public abstract class Coffee {
public abstract void brewing();
}
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();
}
}
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");
}
}
package ch19;
public class Mocha extends Decorator {
public Mocha(Coffee coffee) {
super(coffee);
}
public void brewing() {
super.brewing();
System.out.println("Adding Mocha syrup");
}
}
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도 같은 원리이다.