introduces Template Pattern with abstract class CustomisedItem

This commit is contained in:
Gabba 2018-01-15 17:37:04 +00:00
parent 9b308c8e22
commit 77e9669f6e
9 changed files with 134 additions and 66 deletions

View File

@ -1,9 +1,7 @@
package com.gildedrose;
import com.gildedrose.item.CustomisedItem;
import com.gildedrose.item.Item;
import com.gildedrose.item.CustomisedItemFactory;
import com.gildedrose.item.QualityValues;
class GildedRose {
@ -17,20 +15,7 @@ class GildedRose {
public void updateQuality() {
for (Item item : items) {
itemFactory.customiseItem(item).updateState();
if (hasReachedLowestQualityValue(item)) {
item.quality = QualityValues.lowestValuePossible();
} else if (hasReachedHighestQualityValue(item)) {
item.quality = QualityValues.highestValuePossible(item);
}
itemFactory.customiseItem(item).updateState(item);
}
}
private boolean hasReachedLowestQualityValue(Item item) {
return item.quality < QualityValues.lowestValuePossible();
}
private boolean hasReachedHighestQualityValue(Item item) {
return item.quality > QualityValues.highestValuePossible(item);
}
}

View File

@ -1,6 +1,6 @@
package com.gildedrose.item;
public class AgedBrie implements CustomisedItem {
public class AgedBrie extends CustomisedItem {
private final Item item;
@ -8,16 +8,23 @@ public class AgedBrie implements CustomisedItem {
this.item = item;
}
public void updateState() {
decreaseSellByDayValueByOne();
increaseQualityByOne();
@Override
int updatedItemSellIn() {
return item.sellIn -= 1;
}
private void decreaseSellByDayValueByOne() {
item.sellIn -= 1;
@Override
int updatedItemQuality() {
return item.quality += 1;
}
private void increaseQualityByOne() {
item.quality += 1;
@Override
protected boolean hasReachedHighestQualityValue() {
return item.quality > QualityValues.highestValuePossible(item);
}
@Override
protected boolean hasReachedLowestQualityValue() {
return item.quality < QualityValues.lowestValuePossible();
}
}

View File

@ -1,6 +1,6 @@
package com.gildedrose.item;
public class BackstagePassesItem implements CustomisedItem {
public class BackstagePassesItem extends CustomisedItem {
private final Item item;
@ -8,32 +8,43 @@ public class BackstagePassesItem implements CustomisedItem {
this.item = item;
}
public void updateState() {
decreaseSellByDayValueByOne();
@Override
int updatedItemSellIn() {
return item.sellIn -= 1;
}
@Override
int updatedItemQuality() {
if (sellByDayValueIsOver(10)) {
increaseQualityBy(1);
return qualityIncreasedBy(1);
} else if (sellByDayValueIsOver(5)) {
increaseQualityBy(2);
return qualityIncreasedBy(2);
} else if (sellByDayValueIsOver(0)) {
increaseQualityBy(3);
return qualityIncreasedBy(3);
} else {
dropQualityToZero();
return qualityDroppedToZero();
}
}
private void decreaseSellByDayValueByOne() {
item.sellIn -= 1;
@Override
protected boolean hasReachedHighestQualityValue() {
return item.quality > QualityValues.highestValuePossible(item);
}
@Override
protected boolean hasReachedLowestQualityValue() {
return item.quality < QualityValues.lowestValuePossible();
}
private boolean sellByDayValueIsOver(int dayNumber) {
return item.sellIn > dayNumber;
}
private void increaseQualityBy(int qualityValue) {
item.quality += qualityValue;
private int qualityIncreasedBy(int qualityValue) {
return item.quality += qualityValue;
}
private void dropQualityToZero() {
item.quality = 0;
private int qualityDroppedToZero() {
return 0;
}
}

View File

@ -1,13 +1,38 @@
package com.gildedrose.item;
public class ConjuredItem extends StandardItem {
public class ConjuredItem extends CustomisedItem {
private final Item item;
public ConjuredItem(Item item) {
super(item);
this.item = item;
}
@Override
public int decreasingValueOverZeroDaysToSell() {
return 2;
protected boolean hasReachedHighestQualityValue() {
return item.quality > QualityValues.highestValuePossible(item);
}
@Override
protected boolean hasReachedLowestQualityValue() {
return item.quality < QualityValues.lowestValuePossible();
}
@Override
int updatedItemSellIn() {
return item.sellIn -= 1;
}
@Override
int updatedItemQuality() {
if (sellByDayValueIsOverZero()) {
return item.quality -= 2;
} else {
return item.quality -= 4;
}
}
private boolean sellByDayValueIsOverZero() {
return item.sellIn > 0;
}
}

View File

@ -1,5 +1,23 @@
package com.gildedrose.item;
public interface CustomisedItem {
void updateState();
public abstract class CustomisedItem {
public final void updateState(Item item) {
item.sellIn = updatedItemSellIn();
item.quality = updatedItemQuality();
if (hasReachedLowestQualityValue()) {
item.quality = QualityValues.lowestValuePossible();
} else if (hasReachedHighestQualityValue()) {
item.quality = QualityValues.highestValuePossible(item);
}
}
abstract int updatedItemSellIn();
abstract int updatedItemQuality();
protected abstract boolean hasReachedHighestQualityValue();
protected abstract boolean hasReachedLowestQualityValue();
}

View File

@ -13,7 +13,7 @@ public class CustomisedItemFactory {
public final static String CONJURED_ITEM = "Conjured";
public CustomisedItemFactory() {
ITEM_TYPES_LIST.put(SULFURAS, (item) -> new Sulfuras());
ITEM_TYPES_LIST.put(SULFURAS, Sulfuras::new);
ITEM_TYPES_LIST.put(BRIE, AgedBrie::new);
ITEM_TYPES_LIST.put(BACKSTAGE_PASSES_ITEM, BackstagePassesItem::new);
ITEM_TYPES_LIST.put(CONJURED_ITEM, ConjuredItem::new);

View File

@ -1,6 +1,6 @@
package com.gildedrose.item;
public class StandardItem implements CustomisedItem {
public class StandardItem extends CustomisedItem {
private final Item item;
@ -8,32 +8,31 @@ public class StandardItem implements CustomisedItem {
this.item = item;
}
public void updateState() {
decreaseSellByDayValueByOne();
@Override
int updatedItemSellIn() {
return item.sellIn -= 1;
}
@Override
int updatedItemQuality() {
if (sellByDayValueIsOverZero()) {
decreaseQualityBy(decreasingValueOverZeroDaysToSell());
return item.quality -= 1;
} else {
decreaseQualityBy(decreasingValueForZeroOrLessDaysToSell());
return item.quality -= 2;
}
}
public int decreasingValueOverZeroDaysToSell() {
return 1;
@Override
protected boolean hasReachedHighestQualityValue() {
return item.quality > QualityValues.highestValuePossible(item);
}
private void decreaseSellByDayValueByOne() {
item.sellIn -= 1;
@Override
protected boolean hasReachedLowestQualityValue() {
return item.quality < QualityValues.lowestValuePossible();
}
private boolean sellByDayValueIsOverZero() {
return item.sellIn > 0;
}
private void decreaseQualityBy(int qualityValue) {
item.quality -= qualityValue;
}
private int decreasingValueForZeroOrLessDaysToSell() {
return decreasingValueOverZeroDaysToSell() * 2;
}
}

View File

@ -1,7 +1,30 @@
package com.gildedrose.item;
public class Sulfuras implements CustomisedItem {
public class Sulfuras extends CustomisedItem {
public void updateState() {
private final Item item;
public Sulfuras(Item item) {
this.item = item;
}
@Override
int updatedItemSellIn() {
return item.sellIn;
}
@Override
int updatedItemQuality() {
return item.quality;
}
@Override
protected boolean hasReachedHighestQualityValue() {
return item.quality > QualityValues.highestValuePossible(item) ;
}
@Override
protected boolean hasReachedLowestQualityValue() {
return item.quality < QualityValues.lowestValuePossible();
}
}

View File

@ -74,7 +74,7 @@ public class GildedRoseTest {
}
@Test
public void backstagePassesItemDecreasesQualityByOneIfSellByDayMoreThanEleven() {
public void backstagePassesItemIncreasesQualityByOneIfSellByDayMoreThanEleven() {
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 12, 1);
app.updateQuality();
@ -83,7 +83,7 @@ public class GildedRoseTest {
}
@Test
public void backstagePassesItemDecreasesQualityByTwoIfSellByDayIsMoreThanSix() {
public void backstagePassesItemIncreasesQualityByTwoIfSellByDayIsMoreThanSix() {
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 10, 1);
app.updateQuality();
@ -92,7 +92,7 @@ public class GildedRoseTest {
}
@Test
public void backstagePassesItemDecreasesQualityByThreeIfSellByDayIsMoreThanZero() {
public void backstagePassesItemIncreasesQualityByThreeIfSellByDayIsMoreThanZero() {
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 5, 1);
app.updateQuality();