본문 바로가기

디자인 패턴/디자인 패턴

[디자인 패턴] 스트래티지 패턴 문제 - 커피

책을 공부하며 새로운 문제를 만들고 구현한것을 기록한 게시글입니다.

(이해한 내용을 바탕으로 작성했기 때문에, 내용이 정확하지않고 틀린부분이 있을수있으며, 예시가 패턴을 사용하기에 알맞지 않을수도있습니다)


스트래티지 패턴

- 실행중 알고리즘을 변경할수있도록 하는 디자인 패턴.

- 알고리즘군 각각을 캡슐화하고 상호교환가능하게만듬


문제

카페24에는 자동 커피 제조기가 있다.

 

커피 제조기는 설정된 커피를 무한대로 만드는데, 만들수있는 커피목록은 다음과 같다. 

 

americano

cafe latte

coldbrew

 

손님의 요구에 따라 만들고있는 커피종류를 바꿔야하며, 카페24의 알바생은 현재 만들고있는 커피의 종류를 알고싶다.

알바생은 만들고있는 커피를 바꿀때마다 프로그램에 다음과 같이 기록을한다.

Americano

CafeLatte

ColdBrew

 

이때, 현재 만들고있는 커피를 출력하는 프로그램을 만들자.


구현

우선 카페 24의 커피제조기가 해야할일을 나열해보자.

 

1. 커피 만들기

2. 커피 종류 바꾸기

 

1. 커피만들기 만들고있는 커피 종류에대해 다른 결과를 출력해야하므로 바뀌는 부분이다.

(이후에 메뉴가 추가된다면, 만드는과정을 또 추가해줘야한다.)

2. 커피종류바꾸기 의 경우 바뀌지 않는부분이다. (메뉴가 추가되더라도 바꾸는 방식은 변하지않는다.)

 

바뀌지않는 부분과 바뀌는 부분을 나누자.

 

커피를 만드는 행동 인터페이스 makeCoffee를 만든다.

makeCoffee를 구현한 클래스 dripAmericano, dripCafeLatte, dripColdBrew를 만든다.

dripAmericano의 소스코드는 다음과 같다.

 
package Cafe24;

public class dripAmericano implements makeCoffee{
    public void drip(){
        System.out.println("Drip Americano...");
    }
}

바뀌지않는 부분을 coffeeMachine클래스로 만들고, 이 안에 커피종류 변경 메소드를 작성한다.

coffeeMachine소스코드는 다음과 같다

 
package Cafe24;

public class coffeeMachine {
    makeCoffee coffee;
    
    public void setCoffeeType(makeCoffee cf){
        this.coffee = cf;
    }
    
    public void dripCoffee(){
        coffee.drip();
    }
    
}

인터페이스 형식의 인스턴스변수 makeCoffee를 선언한다(다형성). 

커피가 바뀔때마다, makeCoffee변수를 바뀐 커피 종류로 업데이트 해준다.

 

Americano,CafeLatte,ColdBrew를 제조하는 알고리즘을 각각 만들고, 이를 상호교체가능하게 만들었다.

이렇게 디자인하면, 가변부분과 불변부분을 분리함으로써 이후에 새로운 커피가 추가되더라도 코드의 변경을 최소화할수있다.


전체 소스코드

커밋전에 폴더를 정리하고 올리기때문에, 커밋하는 과정에서 경로가 변경되어 코드 실행이 안될수도있다. (모두 실행되는걸 확인하고올리지만) 컴파일시 경로를 변경해서 실행하도록하자.

 

https://github.com/devxb/DesignPatterns/tree/main/DesignPatterns/prob1.Coffee

 

devxb/DesignPatterns

디자인 패턴 🤔. Contribute to devxb/DesignPatterns development by creating an account on GitHub.

github.com