Я бы на самом деле сказал, что вы не включили достаточно кода, чтобы определить, какой шаблон можно использовать для достижения вашей цели, потому что вы не показали пример кода или подписи вашего класса Filter.
Как ваш класс Report взаимодействует с классом Filter (или наоборот)?
Я не думаю, что это классическая цепь ответственности, потому что в этом случае каждый участник отвечает за вызов следующего участника, обычно с собственным кодом, выполняемым до или после.Подумайте о том, как Windows связывает WindProc с тем, где вы можете выполнять код до или после prio WindProc, и даже можете не вызывать его.
Эти объекты фильтра могут быть декораторами, если реализовать тот же интерфейс, что и основной объект, а затемони обертывают друг друга.Но ваш пример кода содержал объекты в простом списке.В декораторе вы часто видите это:
FilterA fA = new FilterA(coreObject);
FilterB fB = new FilterB(fA);
FilterC fC = new FilterC(fB);
Конечно, это не обязательно делать через конструктор, поэтому, как я уже сказал, нам нужно увидеть больше кода, чтобы узнать, если этобыл декоратором.
Я склонен думать, что вы шли за шаблоном «Трубы и фильтры», где выходные данные каждой операции являются входными данными следующей, но даже это неясно, не зная больше.Я не могу сказать, действует ли каждый фильтр на одну и ту же вещь (например, гигантскую строку), или предполагается, что каждый фильтр взаимодействует с каким-либо аспектом объектной модели отчета.
Например, если у отчета есть свойство объекта, которое является текущим Encoder
, то, возможно, ваш Encode("utf8")
фильтр просто действует как fcatory, который настраивает / устанавливает подкласс Encoder для работы со стратегией персистентности диска,Между тем ваш SubstituteText($predefined_substitutions_array)
действует на коллекцию параметров, принадлежащую отчету, для замены значений времени выполнения.
Я бы предложил описать то, чего вы хотите достичь, а не столько, сколько достичь этого.