Так как ты не сказал, на каком языке пишешь, скину код на питоне:
class Effect:
def __init__(self, name, mods):
self.name = name
self.mods = mods
# mods - это словарь с модификаторами
# ключ - имя поля в классе User
# значение - функция, которая принимает экземпляр класса User и промежуточное значение поля
# а возвращает изменённое значение поля
class User:
def __init__(self, name, strength, agility):
# Инициируем начальные значения
self.name = name
self.strength = strength
self.health = strength * 100
self.agility = agility
self.effects = list()
# в самом классе храним только независимые значения
# но любой доступ к параметрам должен идти через геттер
# для каждого необходимого параметра создаём функцию-геттер
# которая будет учитывать применение эффектов
# можно вместо этого использовать @property
def get_strength(self):
strength = self.strength
for effect in self.effects:
if effect.mods.get('strength'):
strength = effect.mods['strength'](strength, self) # вызываем функцию - модификатор
return strength
def get_agility(self):
agility = self.agility
for effect in self.effects:
if effect.mods.get('agility'):
agility = effect.mods['agility'](agility, self) # вызываем функцию - модификатор
return agility
def get_health(self):
health = self.health
for effect in self.effects:
if effect.mods.get('health'):
health = effect.mods['health'](health, self) # вызываем функцию - модификатор
return health
# Это зависимый параметр
def get_max_health(self):
max_health = self.get_strength() * 100 # первоначальное значение вычисляется на основе силы
for effect in self.effects:
if effect.mods.get('max_health'):
max_health = effect.mods['max_health'](max_health, self) # вызываем функцию - модификатор
return max_health
if __name__ == '__main__':
foo = User('Foo', 10, 10)
god_strength = Effect('God strength', {
'strength': lambda s, u: s + 10
})
def _life_power_func(value, user):
return value + 100
life_power = Effect('Life Power', {
'max_health': _life_power_func
})
def _extra_agility_func(value, user):
return value + 10
# этот эффект влияет сразу на 2 параметра
extra_agility = Effect('Extra agility', {
'agility': _extra_agility_func,
'max_health': lambda h, u: h - 400
})
print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
foo.effects.append(god_strength)
print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
foo.effects.append(life_power)
print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
foo.effects.append(extra_agility)
print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
Результат:
10 1000 1000 10 []
20 2000 1000 10 ['God strength']
20 2100 1000 10 ['God strength', 'Life Power']
20 1700 1000 20 ['God strength', 'Life Power', 'Extra agility']