From 7a1779091577729b4da1fe5b44519bae88c9a7fe Mon Sep 17 00:00:00 2001 From: fiatcode Date: Wed, 18 Feb 2026 12:37:13 +0700 Subject: [PATCH] REFACTOR: introduce strategy pattern for item types --- lib/gilded_rose.dart | 66 +++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/lib/gilded_rose.dart b/lib/gilded_rose.dart index 2322c6e..413c60f 100644 --- a/lib/gilded_rose.dart +++ b/lib/gilded_rose.dart @@ -11,26 +11,14 @@ class Item { String toString() => '$name, $sellIn, $quality'; } -class GildedRose { - List items; +/// Strategy pattern: Each item type has its own update behavior +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 if (item.quality > 0) { item.quality -= 1; @@ -43,8 +31,11 @@ class GildedRose { item.quality -= 1; } } +} - void _updateAgedBrie(Item item) { +class AgedBrieUpdater implements ItemUpdater { + @override + void update(Item item) { // Quality increases as it ages if (item.quality < 50) { item.quality += 1; @@ -57,8 +48,11 @@ class GildedRose { item.quality += 1; } } +} - void _updateBackstagePasses(Item item) { +class BackstagePassUpdater implements ItemUpdater { + @override + void update(Item item) { // Quality increases as concert approaches if (item.quality < 50) { item.quality += 1; @@ -81,9 +75,37 @@ class GildedRose { item.quality = 0; } } +} - void _updateSulfuras(Item item) { +class SulfurasUpdater implements ItemUpdater { + @override + void update(Item item) { // Legendary item never changes // Quality always 80, sellIn never decreases } } + +class GildedRose { + List 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(); + } + } +}