public class Customer {
private final Barista barista;
private final Menu menu;
public Customer(Barista barista, Menu menu) {
this.barista = barista;
this.menu = menu;
}
// 결과값 확인을 위해 반환
public Coffee order(String menuName) {
MenuItem menuItem = menu.getMenuByName(menuName);
return barista.makeCoffee(menuItem);
}
}
public class Menu {
private final List<MenuItem> menuItems;
public Menu(List<MenuItem> menuItems) {
this.menuItems = menuItems;
}
public MenuItem getMenuByName(String menuName) {
return menuItems.stream()
.filter(menuItem -> menuItem.isSameName(menuName))
.findAny()
.orElseThrow(() -> new IllegalArgumentException(String.format("%s에 해당하는 메뉴가 없습니다.", menuName)));
}
}
public class MenuItem {
private final String name;
private final int price;
public MenuItem(String name, int price) {
this.name = name;
this.price = price;
}
public boolean isSameName(String menuName) {
return name.equals(menuName);
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
public class Barista {
public Coffee makeCoffee(MenuItem menuItem) {
return new Coffee(menuItem);
}
}
public class Coffee {
private final String name;
private final int price;
public Coffee(String name, int price) {
this.name = name;
this.price = price;
}
public Coffee(MenuItem menuItem) {
this(menuItem.getName(), menuItem.getPrice());
}
// 결과값 확인을 위해 사용
@Override
public String toString() {
return "Coffee{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
public class CoffeeShop {
public static void main(String[] args) {
List<MenuItem> menuItems = List.of(
new MenuItem("아메리카노", 1500),
new MenuItem("카푸치노", 2000),
new MenuItem("카라멜 마키야또", 2500),
new MenuItem("에스프레소", 2500)
);
Menu menu = new Menu(menuItems);
Barista barista = new Barista();
Customer customer = new Customer(barista, menu);
Coffee coffee = customer.order("아메리카노");
System.out.println(coffee);
}
}
public enum Menu {
AMERICANO("아메리카노", 1500),
CAPPUCCINO("카푸치노", 2000),
CARAMEL_MACCHIATO("카라멜 마키야또", 2500),
ESPRESSO("에스프레소", 2500);
private static final Map<String, Menu> MENU_MAP = new HashMap();
static {
for (Menu menu : values()) {
MENU_MAP.put(menu.getName(), menu);
}
}
private final String name;
private final int price;
Menu(String name, int price) {
this.name = name;
this.price = price;
}
public static Menu getMenuByName(String menuName) {
if (!MENU_MAP.containsKey(menuName)) {
throw new IllegalArgumentException(String.format("%s에 해당하는 메뉴가 없습니다.", menuName));
}
return MENU_MAP.get(menuName);
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
@Test
void 커피주문_협력() {
Customer customer = new Subin();
Cafe cafe = new StarBucks();
cafe.provideService(customer); // 카페 : 손님에게 서비스를 제공할 책임
}
class StarBucks implements Cafe {
Cashier cashier = new Alice();
Barista barista = new Rabbit();
List<Menu> menus = List.of(Menu.AMERICANO, Menu.CAFE_LATTE);
public List<Menu> getMenus() {
return new ArrayList<>(menus);
}
@Override
public void provideService(Customer customer) {
List<Menu> menu = this.getMenus(); // 카페 : 메뉴판 제공할 책임
Menu selectedMenu = customer.selectMenu(menu); // 손님 : 메뉴를 선택할 책임
var coffee = cashier.takeOrder(selectedMenu, barista); // 캐시어 : 선택된 메뉴를 바리스타에게 전달할 책임
customer.drinkCoffee(coffee); // 손님 : 커피를 마실 책임
}
}
interface Customer {
Menu selectMenu(List<Menu> menus);
void drinkCoffee(Coffee coffee);
}
class Subin implements Customer {
private final Random random = new Random();
@Override
public Menu selectMenu(List<Menu> menus) {
var index = random.nextInt(menus.size());
return menus.get(index);
}
@Override
public void drinkCoffee(Coffee coffee) {
System.out.println(coffee + " 마시는 중...");
}
}
public class Main {
public static void main(String[] args) {
Customer customer = new Customer();
Coffee coffee = customer.order(new Cashier(), "americano");
}
}
public enum Menu {
AMERICANO("americano", 3000),
CAFE_LATTE("caffeLatte", 4000),
ESPRESSO("espresso", 3500),
CAPPUCCINO("cappuccino", 3500);
private final String menuName;
private final int price;
Menu(String menuName, int price) {
this.menuName = menuName;
this.price = price;
}
public static Menu selectMenu(String menuName) {
return Arrays.stream(values())
.filter(menu -> menu.menuName.equals(menuName))
.findAny()
.orElseThrow(() -> new IllegalArgumentException("판매하지 않는 메뉴입니다."));
}
public String getMenuName() {
return menuName;
}
public int getPrice() {
return price;
}
}
public class Customer {
public Coffee order(Cashier cashier, String menuName) {
Menu menu = Menu.selectMenu(menuName);
return cashier.order(menu, new Barista());
}
}
public class Cashier {
public Coffee order(Menu menu, Barista barista) {
return barista.makeCoffee(menu);
}
}
public class Barista {
public Coffee makeCoffee(Menu menu) {
return new Coffee(menu);
}
}
public class Coffee {
private String name;
private int price;
public Coffee(Menu menu) {
this.name = menu.getMenuName();
this.price = menu.getPrice();
}
}