有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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添加更多的方法,所以它不是很模块化

如果您建议对此进行改进,我将非常感激。谢谢


共 (2) 个答案

  1. # 1 楼答案

    由于你说你希望以后能够添加新的统计数据和动作,我倾向于创建一个统计数据对象,它不需要知道它所记录的游戏的任何信息。优点是,在添加新特性时,Stats类永远不需要更改

    public interface Stats {
      void incrementStat(Object subject, String stat);
      int getStat(Object subject, String stat);
    }
    

    您的Player实现看起来像:

    public void jump() {
      // Logic to make the player jump...
    
      stats.incrementStat(this, "jump");
    }
    

    当然,为了获得这种灵活性,您需要对这些增量方法进行静态类型检查。但在这种情况下,我倾向于认为简单是值得的。除了从PlayerDataPlayerManager类中删除成吨的锅炉板外,您还可以得到一个可重用的组件,并且可以消除PlayerManagerPlayer之间的循环依赖关系

  2. # 2 楼答案

    我根本不是设计模式方面的专家。但我认为这可能是有用的:

    要向玩家添加动作,您可能需要查看策略模式。只要用谷歌搜索一下,你就会得到很多例子

    以下是我的一个尝试: enter image description here

    对于更新玩家统计信息,我想观察者模式将非常有用

    The Observer Pattern defines one-to-many dependency between objects so that when one object changes state, all of its dependents are notified and updated automatically.

    它强制执行松耦合,以便将来的更改很容易

    (你必须阅读观察者模式,还必须看一些例子。它不像策略那样直截了当。)