Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop - Fatal编程技术网

Java 设计-外部处理的对象的状态

Java 设计-外部处理的对象的状态,java,oop,Java,Oop,有一个与设计相关的问题: 我有一个抽象类播放器,它的子类有AIPlayer、HumanPlayer、NetworkPlayer等,还有类GameManager 当玩家移动时,会给玩家不同类型的牌,可以在以后的移动中使用 我应该在哪里存储玩家可用的卡 解决方案1: 使用getter和setter方法存储在抽象类Player中 问题,,子类可能会通过错误的编码意外地改变玩家拥有的牌。i、 问题是,setter方法对于玩家的子类是可用的,而实际上它应该只对GameManager可用——因为GameMa

有一个与设计相关的问题:

我有一个抽象类播放器,它的子类有AIPlayer、HumanPlayer、NetworkPlayer等,还有类GameManager

当玩家移动时,会给玩家不同类型的牌,可以在以后的移动中使用

我应该在哪里存储玩家可用的卡

解决方案1: 使用getter和setter方法存储在抽象类Player中

问题,,子类可能会通过错误的编码意外地改变玩家拥有的牌。i、 问题是,setter方法对于玩家的子类是可用的,而实际上它应该只对GameManager可用——因为GameManager是唯一允许颁发卡的类

解决方案2: 创建不可修改的PlayerState类,并在GameManager中存储一个从玩家到PlayerState的私有地图。现在GameManager可以管理玩家的状态,就像他们拥有的卡一样,但是玩家的子类只能从GameManager中检索PlayerState对象,他们不能更改它


问题,杀戮过度?我的意思是,玩家本身就是对象,但他们使用另一个对象来获取其状态。

我认为这取决于您将游戏逻辑放在何处:

  • 如果大部分逻辑非常通用,因此在GameManager中,那么在GameManager中管理每个玩家的卡也会更容易。实际上,您可以在GameManager中维护一个私有的
    地图
    来存储每个玩家的卡,并通过将这些地图包装在一个不可修改的地图中,使这些卡对玩家及其实现可见,该地图类似于
    Collections.unmodifiableMap()

  • 如果大多数逻辑是高度特定于玩家的并且与其他玩家没有太多交互,那么最好将逻辑放在玩家或玩家实现中。在这种情况下,您可以直接在抽象玩家中维护一组可修改的

但请始终记住,如果不是在Player中,那么在GameManager中,您将始终能够通过犯代码错误来把事情搞砸。所以差别应该很小