본문 바로가기

OOP

헤드퍼스트 디자인패턴 - 데코레이터 패턴(Decorator Pattern)

예를들어 커피주문을 할 때 사용자의 원하는 기호에 따라 시럽을 넣기도 하고 크림을 더 추가할 수 있다 이럴때 클래스를 상속하고 또 상속을 하면 끝이 없다 그래서 클래스를 추상클래스로 만들 필요가 있다.

public abstract class Beverage {
	String description = "제목없음";
	
	public String getDescription() {
		return description; /* 커피 새 메뉴 이름 description 리턴 */
	}
	
	public abstract double cost(); /* 커피 새 메뉴 가격 리턴 */
}

 
 
추상클래스를 만들어서 새 메뉴가 추가되면 추상클래스와 새메뉴클래스를 하나로 감싸고 메뉴 이름과 가격을 리턴을 한다. 기존 코드를 건드리지 않고 디자인패턴의 데코레이터 확장을 통해 새로운 행동을 추가하는 것 바로 디자인 원칙 중 하나인 OCP(Open-Closed Principle)이다. 확장에는 열려 있어야 하지만 변경에는 닫혀 있어야 한다.
 
 

DarkRoast는 추상클래스인 Beverage클래스로부터 상속받아서 getDescription()과 cost() 두개의 메소들가진다. cost()는 서브 클래스에서 구현해야한다.

 
 
 

public abstract class CondimentDecorator extends Beverage {
	Beverage beverage;
	public abstract String getDescription();
}

첨가물을 나타낸 추상클래스에서 Beverage클래스를 상속받아 객체로 저장하고 새 메뉴가 추가된다면 getDescription 메소드를 통해 새로 구현하도록 하였다. 예를 들어 다크 로스트를 시켰고  모카를 추가로 시킨 것이다. 그 다음 리턴!  
 
 
 
 

하우스 블랜드 커피 
public class HouseBlend extends Beverage{
	public HouseBlend() {
		description = "하우스 블렌드 커피";
	}
	
	public double cost() {
		return .89;
	}
}



모카커피 
public class Mocha extends CondimentDecorator{
	
	public Mocha(Beverage beverage) {   <----- (인스턴스 변수를 감싸고자 하는 객체로 설정하는 생성자)
		this.beverage = beverage;
	}
	
	public String getDescription() {
		return beverage.getDescription() + ", 모카";
				}
	
	public double cost() {
		return beverage.cost() + .20;
	}
}



휘핑크림 
public class Whip extends CondimentDecorator {

	
	
	public Whip(Beverage beverage) {
		this.beverage = beverage;
	}
	
	public String getDescription() {
		return beverage.getDescription() + ", 휘핑크림";
				}

	public double cost() {
		return beverage.cost() + .25;
	}

}
public class StarbuzzCoffee {

	public static void main(String[] args) {
		Beverage beverage = new Espresso();  <---------(기본 에스프레소 주문)
		System.out.println(beverage.getDescription()
				+ " $" + beverage.cost());
		
		Beverage beverage2 = new HouseBlend(); <------(하우스블렌드 객체 생성)
		beverage2 = new Mocha(beverage2);  <----------(모카로 감싸고)
		beverage2 = new Mocha(beverage2); <-----------(모카 하나 더 추가) 
		beverage2 = new Whip(beverage2);  <------------(휘핑크림으로 감싼다)
		System.out.println(beverage2.getDescription()
				+ " $" + beverage2.cost());

	}

}

 
 
 
 
데코레이터로 감싸서 주문 한 결과!!!  

에스프레소 $1.99

하우스 블렌드 커피, 모카, 모카, 휘핑크림 $1.54

'OOP' 카테고리의 다른 글

다형성  (0) 2024.02.01
PHP 객체의 속성에 객체 저장  (0) 2024.01.30
PHP 게터 세터  (0) 2024.01.30
PHP 클래스, 객체  (0) 2024.01.30
헤드퍼스트 디자인패턴 - 상태 패턴(State Pattern)  (0) 2023.11.22