У меня есть список объектов, десериализованных из разных файлов JSON в классы Java. Большинство из них несут только одну ответственность - они хранят данные, десериализованные из файлов JSON, и предоставляют всем, кому это необходимо, доступ к этим данным.
Некоторые из них также имеют некоторую логику, реализованную внутри, например, у меня есть список классов, который реализует интерфейс «Action»:
public interface Action {
boolean canAct(Player player);
void act(Player player);
}
public class ActionRestoreHealth implements Action {
@SerializedName("health")
private int health;
public int getHealth() {
return health;
}
@Override
public boolean canAct(Player player) {
return player.health < player.maxHealth;
}
@Override
public void act(Player player) {
if(player.health + health < maxHealth)
player.health += this.health;
else
player.health = player.maxHealth;
player.notifyHealthChanged();
}
}
Теперь я хочу извлечь все эти классы данных в отдельный модуль maven, чтобы дать другим проектам, связанным с основным простым способом использования всей логики загрузки / десериализации данных.
Но зависимости от таких классов, как «Player» в этих классах держателей данных, не позволяют мне сделать это. Теперь, если я извлеку эту логику данных в отдельный модуль maven - мне нужно будет предоставить информацию о классе Player всем клиентам, вызывающим эту логику.
Я думаю, что когда я реализовал интерфейсы типа «Action» непосредственно в классах держателей данных, я нарушил единую ответственность, а также добавил сильную связь между данными
Держатель класса и Player, и это тоже плохая практика.
Было очень удобно выполнять каждое действие непосредственно из класса держателя данных: мне не нужно ничего знать о конкретном классе действий, простом вызове методов "canAct" и "act", но кажется, что способ, которым я реализовал это, не лучший выбор ,
Мои вопросы:
1) Существуют ли передовые практики / шаблоны проектирования, чтобы разорвать эту связь?
2) Могу ли я где-нибудь извлечь интерфейс Action, чтобы удалить зависимость держателей данных от класса Player, и при этом иметь удобный способ вызова методов canAct и act?