데코레이터 패턴에서는 객체에 추가적인 로직을 동적으로 추가한다.
서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.
cost()
를 구현해야 한다.Beverage
가 모든 첨가물의 존재 유무를 확인할 수 있는 메서드를 가진다. Beverage
를 상속받은 후 cost()
를 구현할 때 슈퍼 클래스 Beverage
의 cost()
를 호출하여 비용을 추가하는 식으로 구현한다. Beverage
를 계속 수정해야한다. 참고) OCP란?
확장에는 열려있고 변경에는 닫혀있어야 한다.
정확히 이해가 되지 않을땐 개발자들은 코드를 직접 보는게 최고다.
한번 위의 요구사항을 데코레이터 패턴을 적용하여 유연하게 만든 코드를 살펴보자.
public abstract class Beverage {
String description = "제목 없음";
public String getDescription() {
return description;
}
public abstract double cost();
}
// Beverage 형태의 변수에 삽입되어야 하기 때문에 상속 활용
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
}
/*
* HouseBlend 커피 클래스
*/
public class HouseBlend extends Beverage {
public HouseBlend() {
description = "하우스 블랜드 커피";
}
public double cost() {
return 0.89;
}
}
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", 모카";
}
/**
* Mocha가 감싸고 있는 beverage의 가격 로직 + 본인의 세부 로직을 합친다.
*/
@Override
public double cost() {
return 0.20 + beverage.cost();
}
}
HouseBlend
메뉴 구현 클래스와 Mocha
첨가물 구현 클래스이다. Mocha
는 데코레이터 클래스로서 로직에서 호출할 Beverage
형태의 변수를 가지고 있다. Beverage
변수에 특정 객체가 삽입되게 된다. public class DecoratorSimulation {
public static void main(String[] args) {
Beverage beverage = new HouseBlend();
beverage = new Mocha(beverage);
beverage = new Mocha(beverage); // 하우스 블랜드 커피 + 모카 + 모카
System.out.println(beverage.getDescription() + " $" + beverage.cost());
}
}
Mocha
첨가물 구현 객체가 HouseBlend
메뉴 구현 객체를 감싼다.Mocha
첨가물 구현 객체가 Mocha
를 다시 한번 감싼다. Mocha
2개를 포함한 HouseBlend
음료가 되었다. berverage.cost()
를 호출함으로써 호출은 mocha -> mocha -> houseblend
순이지만 완료는 houseblend -> mocha -> mocha
순으로 완료된다. FileInputStream
-> BufferedInputStream
-> LineNumberInputStream
이 있는데 LineNumberInputStream
은 행번호를 붙여주는 역할을, BufferedInputStream
은 버퍼 입출력 기능을 FileInputStream
은 데이터를 읽어들일 수 있는 기본 구성요소 역할을 한다. 출처
Head First Design Patterns - (에릭 프리먼, 엘리자베스 프리먼, 케이시 시에라, 비트 베이츠) 을 보며 정리한 내용입니다.