Как лучше всего разбить данный код на маленькие звенья?

В общем, есть жирные классы, которые накладывают эффекты на игрока, назовем их Applicator'ы. Между ними дублируется код. Скажем, есть Applicator, который дает броню игроку, а есть Applicator, который броню и урон дает.

Applicator'ы имеют 2 метода Apply и Drop. Apply-выполняет над игроком логику бафа, а Drop, соответственно, возвращает все назад.

Хочется сделать так, чтобы можно было Applicator'ы собирать из маленьких кусочков + повысить общую гибкость.

Как я себе вижу новую систему:

  1. Наложить урон и наложить броню - это отдельные звенья
  2. Каждое звено знает, как сделать apply и drop себя
  3. Звенья объдиняются в цепочки и вызываются в порядке в котором они были сконфигурированы для Эффекта.
  4. Звенья передают итог своего выполнения в следующее звено цепочки. А следующее звено может заюзать эти данные, а может и нет (зависит от конкретного звена)
  5. Между звеньями, которые накладывают на игрока эффекта, могут быть звенья, которые несут какую-то логику, например, мутировать параметры перед передачей в другую цепочку. Думаю, что еще и Condition'ы могут быть. Типа проверка, сколько урона наложилась и если true, то выполнять другие цепочки, а если false, то закончить
  6. В первое звено передается набор всех необходимых параметров, которые нужны для выполнения всей цепочки, а каждое звено берет лишь необходимое себе (3 словаря <string,int>,<string,string>,<string,bool>)

По идее вот как-то так, я вижу новую систему. В голове представление есть, но как +- это в коде организовать не знаю.

Например, пока не знаю, как лучше: Должен ли каждое звено знать друг о друге и явно быть объеденено между собой. Например в Asp.Net есть middleware, которые явно другие звенья вызывают или засунуть все в коллекции и доверить последовательное выполнение другой сущности. Мне кажется, что во втором случае, если возникнет вдруг потребность в ветвлении, то могут быть проблемы с реализацией.

Визуально я вижу это, как какой-то fluent интерфейс.

Хотелось бы каких-нибудь референсов или паттернов, которые я могу взять за основу.


Ответы (0 шт):