본문 바로가기

디자인 패턴/디자인 패턴

[디자인 패턴] 어댑터 패턴 문제 - 레스토랑

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

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


어댑터 패턴

인터페이스를 클라이언트에서 요구하는 인터페이스로 변경함으로써, 인터페이스를 호환시키는 패턴

 


문제

저번에 풀었던, 파스타 문제와 연결되는 문제다.

https://dlwnsdud205.tistory.com/177?category=855600

 

[디자인 패턴] 싱글턴 패턴 문제 - 파스타 (데코레이터, 옵저버, 팩토리)

책을 공부하며 새로운 문제를 만들고 구현한것을 기록한 게시글입니다. (이해한 내용을 바탕으로 작성했기 때문에, 내용이 정확하지않고 틀린부분이 있을수있으며, 예시가 패턴을 사용하기에

dlwnsdud205.tistory.com

파스타가게만 전문취급하는 파스타거리에 레스토랑이 입점했다.

이 레스토랑은 파스타, 피자, 스테이크 ... 등 매우 매우 많은 음식을 취급한다.

 

레스토랑이 하는일은 다음과 같다.

1. 고객의 주문을 받는다.

2. 음식을 만든다.

 

이 레스토랑때문에, 망한 AmreicanStylePastaStore와, ItalianStylePastaStore은 이제 레스토랑에게 자신의 파스타를 공급한다.

취급하는 음식이 매우 매우 많은 레스토랑은 음식을 일일이 관리하기힘들어, 공급받는 음식을 일정한 형태로 받기를 원한다.

즉, 우리는 우리의 파스타를 레스토랑이 원하는 형태로 만들어 줘야하는것이다 음식의 본질이 파스타라는것은 유지한채로.

 

파스타를 먹기위해 다시한번 파스타 거리를 찾아온 명수는 자신의 단골 가게(American..., Italian...)이 망해버린것을 보고 레스토랑에 가서 파스타를 주문할려고한다. 

 

명수의 주문내역과 파스타재료의 가격변동이 주어질때, 메뉴 이름과 가격을 출력하는 프로그램을 만들자.

 

입력은 다음과 같다.

첫번째 줄에 테스트케이스 횟수 N이 주어진다.

두번째 줄에 명수가 주문할 파스타의 형식(AmericanPasta, ItalianPasta)이 주어진다.

세번째 줄에 가격변동이 5번 주어진다. (원재료의 종류가 5개다.)

네번째 줄에 메뉴가 주어진다. (CheeseOvenPasta, RosePasta, AglioOlioPasta)

 

ex)

입력 : 

4

AmericanPasta 

3 2 3 1 2 

CheeseOvenPasta

 

출력 : 

CheeseOvenPasta $17

 


구현

까다로운 레스토랑의 요구에 맞춰, 우리의 파스타를 일정한 형태로 포장해야한다.

 

우선, 레스토랑이 추가되었으니, 레스토랑에 해당하는 인터페이스를 만들자.

 

레스토랑이 하는일인

1. 주문받기와

2. 음식 만들기 메소드를 만든다.

package prob4_pasta.Restaurants;

public interface Restaurants {
    void order();
    void makeFood();
}

 

 

이때, 레스토랑에서 파는 다른음식인(피자, 스테이크...등등)은 우리가 신경쓸 필요없다. 우리는 우리가 만드는 파스타를 레스토랑에 입맛에맞춰 제공만해주면된다.

 

이제, 파스타를 레스토랑이 원하는 형태로 변경하는 (어댑터) 역할을 하는 클래스를 만들자.

 

package prob4_pasta.Adapter;

import prob4_pasta.Restaurants.*;
import prob4_pasta.Store.*;

public class PastaToRestaurants implements Restaurants{
    
    private PastaStore pastaStore;
    
    public PastaToRestaurants(PastaStore pastaStore){
        this.pastaStore = pastaStore;
    }
    
    public void order(String menu){
        makeFood(menu);
    }
    
    public void makeFood(String menu){
        this.pastaStore.orderPasta(menu);
    }
    
}

 

코드가 굉장히 간단한데, PastaToRestaurants클래스에서는 생성자로 파스타 스토어를 받는다. 이때, 레스토랑의 메소드인

order와 makeFood에 대해서 pastaStore의 구현을 넣어주면된다.

 

order메소드는 손님의 주문이다. 우리가 여기서 따로 처리할일은 없으니 바로 makeFood로 넘겨주자.

makeFood가 입력으로 주어지면 우리는 orderPasta를 출력하면된다.

 

이제, 시뮬레이터부분을 수정하자.

 

package prob4_pasta.Simulator;

import prob4_pasta.Pasta.*;
import prob4_pasta.Pasta.Ingredients.*;
import prob4_pasta.Store.*;
import prob4_pasta.Supplier.*;
import prob4_pasta.Restaurants.*;
import prob4_pasta.Adapter.*;
import java.util.Scanner;

public class Simulator {
    
    public static void main(String[] args){
        
        Scanner sc = new Scanner(System.in);
        
        // START supplier와 재료들 새팅
        Supplier supplier = Supplier.getInstance();
        supplier.addObserver(new Cheese());
        supplier.addObserver(new PastaNoodles());
        supplier.addObserver(new OliveOil());
        supplier.addObserver(new TomatoSauce());
        supplier.addObserver(new Hurb());
        // END supplier와 재료들 세팅 
        
         // 초기 모든 재료의 가격은 $0임
        int N = sc.nextInt();
        for(int i = 0; i < N; i++){
            String store = sc.next();
            Restaurants restaurants;
            if(store.equals("AmericanPasta")) restaurants = new PastaToRestaurants(new AmericanStylePastaStore());
            else if(store.equals("ItalianPasta")) restaurants = new PastaToRestaurants(new ItalianStylePastaStore());
            else{
                System.out.println("없는 가게입니다!");
                continue;
            }
            supplier.updatePrice();
            String menu = sc.next();
            restaurants.order(menu);
        }
    }
    
    
    
}

 

이제 손님은 레스토랑에서 주문한다. 마지막줄을보면, 손님이 restaurants.order을 호출하여 주문을 하는것을 볼수있다. 따라서, 우리는 이에맞춰 우리의 파스타를 변경해줘야한다. 

store.equals("AmericanPasta")을 보자. 파스타 가게가 입력되었을때, 우리의 파스타를 아까만든 PastaToRestaurants로 포장해준다. (무슨 메뉴를 입력받는지는 레스토랑이 처리하므로 신경쓸 필요없다.)

 


최종 코드

https://github.com/devxb/DesignPatterns/tree/main/DesignPatterns/prob6_pasta

 

devxb/DesignPatterns

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

github.com