2016-08-31 2 views
2

У меня есть объект Reward, который дает вознаграждение игроку.Как создать взаимодействие между моделью и сервисом?

Итак, когда все условия выполнены, вызывается метод executeReward();

Проблема в том, что реализация может быть очень различной. Например, Reward может давать деньги игроку или начинать глобальное событие или давать игроку еще один квест (не имеющий отношения к предыдущему). То есть Я не знаю, какая логика будет выполнена. Как это можно спроектировать? С точки зрения связи между моделью и сервисом.

Опции Я думал о:

  1. Создать награду сервис, где различные методы будут вызываться из executeReward(RewardService rs) метода, но это ломается «модель не знает об услуге».

  2. Организовать логику в сервисном слое. Но для этого требуется ручное сопоставление, которое уничтожает всю цель иерархии в домене.

Ничего хорошего. Есть ли хороший способ сделать это?

пс: объект вознаграждения извлекается из БД через спящий режим. Поэтому осложнение (потенциально) возникает из-за спящего режима, не вставляя службы. При этом субъекты обычно должны воздерживаться от предоставления услуг AFAIK.

+0

В настоящее время 'executeReward' находится в объекте модели Reward? Я имею в виду, что он делает и каково ожидаемое возвращаемое значение после его выполнения? – maks

+0

public void executeReward(); – Sarief

+0

Например, вознаграждение может давать деньги игроку или начинать глобальное событие или давать игроку еще один квест (не имеющий отношения к предыдущему). То есть Я не знаю, какая логика будет выполнена. – Sarief

ответ

4

Решение 1

Я бы реализовать поощрений логику через Command behavioral design pattern.

E.g. ввести общий Reward интерфейс с одним execute метода и герметизировать различные награды, как это реализация: MoneyReward, QuestReward и т.д. Каждый из этих конкретных реализаций должны получает все необходимые для исполнения во время его создания:

class MoneyReward implements Reward { 
    MoneyReward(Player gamer, Depository money) { 
     ... 
    } 
    @Override 
    public execute() { 
     ... 
    } 
} 
... 
class QuestReward implements Reward { 
    MoneyReward(Player gamer, Map territory) { 
     ... 
    } 
    @Override 
    public execute() { 
     ... 
    } 
} 

После выбора необходимого Reward лица на база ваших условий вы можете просто сделать награду:

Raward gift = ... 
gift.execute(); 

Решение 2

В качестве альтернативы можно использовать Strategy behavioral design pattern.

E.g. Reward интерфейса можно рассматривать как этот

interface Reward { 
    void execute(Player gamer); 
} 

И один из возможной реализации является

class MoneyReward implements Reward { 
    MoneyReward(Depository money) { 
     ... 
    } 
    @Override 
    public execute(Player gamer) { 
     ... 
    } 
} 

Что различия между MoneyReward командой и стратегией здесь?

Команда инкапсулирует все необходимое для ее выполнения во время создания и может использоваться один раз для определенного игрока. Каждый раз, когда вы хотите сделать вознаграждение, вам нужно создать команду команды MoneyReward.

Стратегия оппонента MoneyReward включает в себя только общие сервисы, необходимые для создания перелома среди всех игроков. MoneyReward стратегия может быть создана один раз (например, Spring singleton) и повторно использоваться в течение всего срока службы приложения.

Примечание: в обоих растворах Depository, Map, Player должны быть небольшими четко определенные интерфейсы не нарушая Single Responsibility Principle.

+0

Я сделал такую ​​глупую ошибку :(мой объект создается с помощью спящего режима, а службы - @Service с весны ... <- это было только косвенно подразумевается, извините за путаницу – Sarief

+0

Это может работать, но дело в том, как бы вы дали эту награду внутри метода? gamer.putMoneyToInventory (money)? или gamer.getInverntory(). putMoney (money)? до этого момента все в порядке, и я, вероятно, соглашусь этот ответ, поскольку то, что я нашел, заключается в том, что моя основная модель-модель анемична (вся логика находится в слоях обслуживания), что оставляет меня без обоих этих вариантов. К сожалению, я обнаружил это после того, как набрал бонус ... – Sarief

+0

@Sarief Как выглядит ваш объект «Reward» из Hibernate? Является ли это просто DTO с некоторыми полями? Какая информация у вас есть? –

Смежные вопросы