gpt4 book ai didi

java - 如何设计模型与服务的交互?

转载 作者:行者123 更新时间:2023-11-30 06:52:16 25 4
gpt4 key购买 nike

我有一个实体 Reward 可以给玩家奖励。

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

问题是:实现可能非常不同。例如,Reward 可以是给玩家钱,或者开始全局事件,或者给玩家另一个任务(与之前的任务无关)。 IE。不知道会执行什么逻辑。这怎么设计?在模型和服务之间的通信方面。

我考虑的选项:

  1. 创建奖励服务,其中会从 executeReward(RewardService rs) 方法调用不同的方法,但这打破了“模型不知道服务”。

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

似乎都不是好的选择。有什么好的方法吗?

ps:奖励实体是通过 hibernate 从数据库中获取的。因此,由于 hibernate 不插入服务,(可能)出现了并发症。也就是说,实体通常应该避免提供服务,AFAIK。

最佳答案

解决方案一

我会通过 Command behavioral design pattern 实现奖励逻辑.

例如使用一个execute 方法引入通用的Reward 接口(interface),并在实现时封装各种奖励:MoneyRewardQuestReward 等。每个这个特定实现的一部分应该在创建期间获得执行所需的一切:

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();

方案二

或者 Strategy behavioral design pattern可以使用。

例如Reward界面可能是这样的

interface Reward {
void execute(Player gamer);
}

其中一种可能的实现方式是

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

这里的MoneyReward命令和策略有什么区别?

该命令封装了创建期间执行它所需的所有内容,并且可以为特定玩家使用一次。每次你想要奖励你需要创建 MoneyReward 命令实例。

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

注意:在这两个解决方案中,DepositoryMapPlayer 应该是定义良好的小型接口(interface),不会破坏Single Responsibility Principle .

关于java - 如何设计模型与服务的交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39243388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com