From 0dca9b86e1e8810191fda5a36403e67408904cd8 Mon Sep 17 00:00:00 2001 From: Richard Xu Date: Thu, 22 Dec 2022 16:58:29 -0500 Subject: [PATCH] Add item handler factory --- .../main/java/com/gildedrose/GildedRose.java | 39 +++---------------- .../com/gildedrose/ItemHandlerFactory.java | 37 ++++++++++++++++++ 2 files changed, 42 insertions(+), 34 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/ItemHandlerFactory.java diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index d23d2a24..71cd13bf 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,49 +1,20 @@ package com.gildedrose; -import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.List; -import java.util.Map; class GildedRose { - private static final Map> ITEM_HANDLER_MAP = Map.of( - ItemType.AGED_BRIE, - AgedBrieItemHandler.class, - ItemType.SULFURAS, - SulfurasItemHandler.class, - ItemType.BACKSTAGE_PASSES, - BackstagePassesItemHandler.class, - ItemType.CONJURED, - ConjuredItemHandler.class, - ItemType.GENERIC, - GenericItemHandler.class - ); - // make package-private - public final List items; + final List items; public GildedRose(Item[] items) { this.items = Arrays.asList(items); } - // todo: refactor this to use Guice - private static void handleDay(Item item) { - try { - ItemHandler itemHandler = ITEM_HANDLER_MAP - .get(ItemType.forDisplayName(item.name)) - .getDeclaredConstructor() - .newInstance(); - itemHandler.handleDay(item); - } catch ( - InstantiationException - | IllegalAccessException - | InvocationTargetException - | NoSuchMethodException e - ) { - throw new RuntimeException(e); - } + public void updateQuality() { + items.forEach(this::handleDay); } - public void updateQuality() { - items.forEach(GildedRose::handleDay); + private void handleDay(Item item) { + ItemHandlerFactory.getItemHandler(item).handleDay(item); } } diff --git a/Java/src/main/java/com/gildedrose/ItemHandlerFactory.java b/Java/src/main/java/com/gildedrose/ItemHandlerFactory.java new file mode 100644 index 00000000..17e01410 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ItemHandlerFactory.java @@ -0,0 +1,37 @@ +package com.gildedrose; + +import java.lang.reflect.InvocationTargetException; +import java.util.Map; + +public class ItemHandlerFactory { + + private static final Map> ITEM_HANDLER_MAP = Map.of( + ItemType.AGED_BRIE, + AgedBrieItemHandler.class, + ItemType.SULFURAS, + SulfurasItemHandler.class, + ItemType.BACKSTAGE_PASSES, + BackstagePassesItemHandler.class, + ItemType.CONJURED, + ConjuredItemHandler.class, + ItemType.GENERIC, + GenericItemHandler.class + ); + + // todo: use guice + public static ItemHandler getItemHandler(Item item) { + try { + return ITEM_HANDLER_MAP + .get(ItemType.forDisplayName(item.name)) + .getDeclaredConstructor() + .newInstance(); + } catch ( + InstantiationException + | IllegalAccessException + | InvocationTargetException + | NoSuchMethodException e + ) { + throw new RuntimeException(e); + } + } +}