예를들어 커피주문을 할 때 사용자의 원하는 기호에 따라 시럽을 넣기도 하고 크림을 더 추가할 수 있다 이럴때 클래스를 상속하고 또 상속을 하면 끝이 없다 그래서 클래스를 추상클래스로 만들 필요가 있다.
public abstract class Beverage {
String description = "제목없음";
public String getDescription() {
return description; /* 커피 새 메뉴 이름 description 리턴 */
}
public abstract double cost(); /* 커피 새 메뉴 가격 리턴 */
}
추상클래스를 만들어서 새 메뉴가 추가되면 추상클래스와 새메뉴클래스를 하나로 감싸고 메뉴 이름과 가격을 리턴을 한다. 기존 코드를 건드리지 않고 디자인패턴의 데코레이터 확장을 통해 새로운 행동을 추가하는 것 바로 디자인 원칙 중 하나인 OCP(Open-Closed Principle)이다. 확장에는 열려 있어야 하지만 변경에는 닫혀 있어야 한다.
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 |