REFACTOR: introduce strategy pattern for item types

This commit is contained in:
fiatcode 2026-02-18 12:37:13 +07:00
parent 5655326543
commit 7a17790915

View file

@ -11,26 +11,14 @@ class Item {
String toString() => '$name, $sellIn, $quality'; String toString() => '$name, $sellIn, $quality';
} }
class GildedRose { /// Strategy pattern: Each item type has its own update behavior
List<Item> items; abstract class ItemUpdater {
void update(Item item);
GildedRose(this.items);
void updateQuality() {
for (final item in items) {
if (item.name == 'Sulfuras, Hand of Ragnaros') {
_updateSulfuras(item);
} else if (item.name == 'Aged Brie') {
_updateAgedBrie(item);
} else if (item.name == 'Backstage passes to a TAFKAL80ETC concert') {
_updateBackstagePasses(item);
} else {
_updateNormalItem(item);
}
}
} }
void _updateNormalItem(Item item) { class NormalItemUpdater implements ItemUpdater {
@override
void update(Item item) {
// Quality decreases by 1 each day // Quality decreases by 1 each day
if (item.quality > 0) { if (item.quality > 0) {
item.quality -= 1; item.quality -= 1;
@ -43,8 +31,11 @@ class GildedRose {
item.quality -= 1; item.quality -= 1;
} }
} }
}
void _updateAgedBrie(Item item) { class AgedBrieUpdater implements ItemUpdater {
@override
void update(Item item) {
// Quality increases as it ages // Quality increases as it ages
if (item.quality < 50) { if (item.quality < 50) {
item.quality += 1; item.quality += 1;
@ -57,8 +48,11 @@ class GildedRose {
item.quality += 1; item.quality += 1;
} }
} }
}
void _updateBackstagePasses(Item item) { class BackstagePassUpdater implements ItemUpdater {
@override
void update(Item item) {
// Quality increases as concert approaches // Quality increases as concert approaches
if (item.quality < 50) { if (item.quality < 50) {
item.quality += 1; item.quality += 1;
@ -81,9 +75,37 @@ class GildedRose {
item.quality = 0; item.quality = 0;
} }
} }
}
void _updateSulfuras(Item item) { class SulfurasUpdater implements ItemUpdater {
@override
void update(Item item) {
// Legendary item never changes // Legendary item never changes
// Quality always 80, sellIn never decreases // Quality always 80, sellIn never decreases
} }
} }
class GildedRose {
List<Item> items;
GildedRose(this.items);
void updateQuality() {
for (final item in items) {
final updater = _selectUpdater(item);
updater.update(item);
}
}
ItemUpdater _selectUpdater(Item item) {
if (item.name == 'Sulfuras, Hand of Ragnaros') {
return SulfurasUpdater();
} else if (item.name == 'Aged Brie') {
return AgedBrieUpdater();
} else if (item.name == 'Backstage passes to a TAFKAL80ETC concert') {
return BackstagePassUpdater();
} else {
return NormalItemUpdater();
}
}
}