经常要为玩家角色存储一些数据,比如神器,装备,时装,他们都是GameObject,就像这样:
GameObject 类代码:
public enum DataState {
......
};
protected DataState curDataState = DataState.dsModify;
......
protected abstract int saveInsert();
protected abstract int saveDelete();
protected abstract int saveModify();
public abstract long getId();
public abstract void setAllModifyState();
public abstract void clearModifyState();
public abstract int deleteObject();
@JsonIgnore
protected boolean bSaveDBFlag = false;
@JsonIgnore
public boolean isSaveDBFlag() {
return bSaveDBFlag;
}
@JsonIgnore
public String getClassFlag() {
......
}
@JsonIgnore
private SqlExecuter getExecuter() {
......
}
/**
* 标记存库成功,设置对应的状态
*/
public final void saveDBSuccessed() {
......
}
/**
* 如果所存储的Manager容器默认IdMap有记录数组Index索引,那么就可以通过这个index索引来快速找到对象在ArrayList中的位置
*/
public int arrayIndex = 0;
public void autoSave() {
......
}
public void saveToDB() {
......
}
/**
* 计划存储
*
* @return
*/
public void saveToDBInPlan() {
......
}
public void realSaveToDB() {
......
}
/**
* 把对象放入到执行任务中
*/
public int AddObjToTask() {
......
}
每一个角色都要有自己的GameObject,也就有自己的容器GameObjectMgr,每一个角色都有自己的GameObjectMgr,存储所有角色的游戏物品的类,可以设计为GameDataHolder:
所有角色的游戏物品的载体类GameDataHolder 代码:
//manager的class,角色id,manager
public static Map<Class<?>, Map<Long, Object>> roleMap = new HashMap<>();
public static <T extends GameObjectMgr<?>> T getMgr(Class<T> clz, Long roleId, Supplier<T> mgrGenerator) {
Map<Long, Object> mgrMap = roleMap.get(clz);
if (mgrMap == null) {
mgrMap = new HashMap<>();
roleMap.put(clz, mgrMap);
}
Object t = mgrMap.get(roleId);
if (t == null) {
t = mgrGenerator.get();
}
return clz.cast(t);
}
1.使用享元模式,而不是多个单例,代码量大大减少,符合单一职责原则。
2.java的Supplier的惰性加载。
3.外部传入mgrGenerator对象,生成GameObjectMgr对象。
4.使用Class对象cast方法,防止对象转换时出现的警告。
网友评论