Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设计模型和服务之间的交互?_Java - Fatal编程技术网

Java 如何设计模型和服务之间的交互?

Java 如何设计模型和服务之间的交互?,java,Java,我有一个实体奖励,给玩家奖励 因此,当所有条件都满足时,调用方法executeward() 问题是:实现可能非常不同。例如,奖励可以是给玩家钱,或者开始全球活动,或者给玩家另一个任务(与之前的任务无关)。也就是说,我不知道将执行什么逻辑。这是如何设计的?在模型和服务之间的通信方面 我正在考虑的选择: 创建奖励服务,从executeward(RewardService rs)方法调用不同的方法,但这打破了“模型不知道服务” 在服务层中编排逻辑。但这需要手动映射,这破坏了域中层次结构的全部目的 两者

我有一个实体
奖励
,给玩家奖励

因此,当所有条件都满足时,调用方法
executeward()

问题是:实现可能非常不同。例如,
奖励
可以是给玩家钱,或者开始全球活动,或者给玩家另一个任务(与之前的任务无关)。也就是说,我不知道将执行什么逻辑。这是如何设计的?在模型和服务之间的通信方面

我正在考虑的选择:

  • 创建奖励服务,从
    executeward(RewardService rs)
    方法调用不同的方法,但这打破了“模型不知道服务”

  • 在服务层中编排逻辑。但这需要手动映射,这破坏了域中层次结构的全部目的

  • 两者都不是好的选择。有什么好办法吗


    ps:奖励实体通过hibernate从数据库中获取。因此,由于hibernate没有插入服务,会(潜在地)出现复杂情况。也就是说,实体通常应该避免使用服务,AFAIK。

    解决方案1

    我将通过实现奖励逻辑

    例如,使用一个
    执行
    方法引入通用的
    奖励
    接口,并将各种奖励封装为其实现:
    金钱奖励
    向请求
    等。每个具体实现应在创建过程中获得执行所需的所有信息:

    class MoneyReward implements Reward {
       MoneyReward(Player gamer, Depository money) {
          ...
       }
       @Override 
       public execute() {
          ...
       }
    }
    ...
    class QuestReward implements Reward {
       MoneyReward(Player gamer, Map territory) {
          ...
       }
       @Override 
       public execute() {
          ...
       }
    }
    
    根据您的条件选择所需的
    奖励
    实体后,您只需执行奖励:

    Raward gift = ...
    gift.execute();
    
    解决方案2

    或者也可以使用

    例如,
    奖励
    界面可能如下所示

    interface Reward {
       void execute(Player gamer);
    }
    
    其中一个可能的实现是

    class MoneyReward implements Reward {
       MoneyReward(Depository money) {
          ...
       }
       @Override 
       public execute(Player gamer) {
          ...
       }
    }
    
    这里的
    MoneyReward
    命令和策略有什么区别

    该命令封装了创建过程中执行所需的所有内容,并且可以为特定玩家使用一次。每次您想要执行奖励时,都需要创建
    MoneyReward
    命令实例

    相反的
    MoneyReward
    策略只封装了在所有玩家之间进行改写所需的公共服务
    MoneyReward
    策略可以创建一次(如Spring singleton),并在应用程序的整个生命周期内重复使用


    注意:在这两种解决方案中,
    仓库
    地图
    播放器
    应该是小型的、定义良好的接口,不会中断

    当前
    executeward
    是否在您的奖励模型对象中?我的意思是它做什么,执行后的预期返回值是多少?public void executeward();例如,奖励可以是给玩家钱,或者开始全球活动,或者给玩家另一个任务(与之前的任务无关)。例如,我不知道将执行什么逻辑我犯了这样一个愚蠢的错误:(我的对象是用hibernate实例化的,服务是@Service from spring…这可能会起作用,但问题是,你如何从方法内部给予这个奖励?gamer.putMoneyToInventory(money)?或gamer.GetInventory().putMoney(money)?到目前为止还可以,我可能会接受这个答案,因为我发现我的核心模块模型是贫血的(所有逻辑都在服务层中),这让我没有这两个选项。不幸的是,我在悬赏之后发现了这一点…@Sarief你从Hibernate获得的
    奖励
    实体是什么样子的?它只是一些字段的DTO吗?你在其中有什么样的信息?简单地说,它是带有一些方法的id。现在,派生类有了自己的字段(RewardAmount)并覆盖家长的奖励(玩家)。