java正在寻找合适的设计模式
我有一个游戏,在每场比赛后跟踪用户的统计数据,比如他们跑了多远,攻击了多少次,摔倒了多远等等,我目前的实现看起来有点像下面(简化版):
Class Player{
int id;
public Player(){
int id = Math.random()*100000;
PlayerData.players.put(id,new PlayerData());
}
public void jump(){
//Logic to make the user jump
//...
//call the playerManager
PlayerManager.jump(this);
}
public void attack(Player target){
//logic to attack the player
//...
//call the player manager
PlayerManager.attack(this,target);
}
}
Class PlayerData{
public static HashMap<int, PlayerData> players = new HashMap<int,PlayerData>();
int id;
int timesJumped;
int timesAttacked;
}
public void incrementJumped(){
timesJumped++;
}
public void incrementAttacked(){
timesAttacked++;
}
}
Class PlayerManager{
public static void jump(Player player){
players.get(player.getId()).incrementJumped();
}
public void incrementAttacked(Player player, Player target){
players.get(player.getId()).incrementAttacked();
}
}
所以我有一个PlayerData类,它保存了所有的统计数据,并将其从player类中带出来,因为它不是player逻辑的一部分。然后我有PlayerManager,它将在服务器上,控制玩家之间的交互(很多这样做的逻辑都被排除在外,所以我可以保持简单)。我把对PlayerData类的调用放在Manager类中,因为有时你必须在玩家之间进行某些检查,例如如果攻击确实命中,那么你就增加“attackHits”
主要的问题(在我看来,如果我错了,请纠正我)是这不是非常可扩展的。如果我想通过添加方法和字段来跟踪一个新的统计数据,那么我必须接触PlayerData类,然后我必须向我的PlayerManager添加更多的方法,所以它不是很模块化
如果您建议对此进行改进,我将非常感激。谢谢
# 1 楼答案
由于你说你希望以后能够添加新的统计数据和动作,我倾向于创建一个统计数据对象,它不需要知道它所记录的游戏的任何信息。优点是,在添加新特性时,Stats类永远不需要更改
您的
Player
实现看起来像:当然,为了获得这种灵活性,您需要对这些增量方法进行静态类型检查。但在这种情况下,我倾向于认为简单是值得的。除了从
PlayerData
和PlayerManager
类中删除成吨的锅炉板外,您还可以得到一个可重用的组件,并且可以消除PlayerManager
和Player
之间的循环依赖关系# 2 楼答案
我根本不是设计模式方面的专家。但我认为这可能是有用的:
要向玩家添加动作,您可能需要查看策略模式。只要用谷歌搜索一下,你就会得到很多例子
以下是我的一个尝试:
对于更新玩家统计信息,我想观察者模式将非常有用
它强制执行松耦合,以便将来的更改很容易
(你必须阅读观察者模式,还必须看一些例子。它不像策略那样直截了当。)