Cześć, trochę się zakręciłem w wyborze odpowiedniego rozwiązania problemu, który opiszę poniżej:
Napisałem uniwersalny, rekursywny importer plików z danego katalogu. Uniwersalny, ponieważ będę wykorzystywał go wielokrotnie do importu różnych plików, głównie CSV.
Jestem w miejscu, gdzie muszę dodać konkretną logikę wczytywania plików, która polega na wywołaniu funkcji flushStack() na obiekcie reprezentującym proces importu (ten obiekt tworzy stos z poprawnych obiektów utworzonych na podstawie danych z pliku i po zebraniu 100 obiektów robi batch insert). Tą funkcję wywołuje obiekt procesu importu wewnętrznie, ale gdy dojdzie do końca pliku, to też musi się wykonać, bo mało prawdopodobne, abym uzbierał w stosie akurat 100 obiektów dla ostatniego wiersza pliku.

Mam takie klasy (w dużym uproszczeniu, bo importer jest dosyć skomplikowany):
RecursiveFilesystemImporter
CsvFileImporter
BusinessLogicLineImporterBridge (most dla w sumie 8 różnych importerów linii w zależności od wartości pierwszej kolumny, ale importer pliku nie musi o tym wiedzieć, dlatego użyłem mostu)
BusinessLogicImport (obiekt reprezentujący sam proces, to on posiada stos obiektów i metodę flushStack)

Mam do wyboru 2 rozwiązania:

1. Zrobić nową klasę BusinessLogicCsvFileImporter extends CsvFileImporter, która przyjmuje jako argument konstruktora instancję BusinessLogicImport, nadpisać metodę import poprzez wywołanie metody rodzica i na końcu BusinessLogicImport::flushStack
Zalety:
Prostota.
Wady:
Niestety do logiki importu plików samej w sobie dorzucam logikę biznesową związaną z konkretnym procesem, który dla innych wykorzystań importera już nie ma zastosowania.

2. Zrobienie tego, co powyżej, tylko że za pomocą dekoratora
Zalety:
Nie rozszerzam logiki importu plików samej w sobie o logikę biznesową i mogę taki importer ująć po prostu w uniwersalny pakiet (korzystam z Symfony).
Wady:
Boję się przerostu formy nad treścią. To rozwiązanie bardziej do mnie przemawia z uwagi na jego zalety, jednak dekorator nie służy do realizacji logiki biznesowej, tylko do dodawania nowych funkcjonalności do obiektu dekorowanego.

Co o tym myślicie? Który sposób wybrać? Posiadam jeszcze TransactionalORMFileImporterDecorator, którym mogę udekorować cały proces importu pojedynczych plików w transakcję i on na 100% zostaje. Temat chyba bardziej do działu pro, ale nie mogłem tam utworzyć nowego wątku.