明天你会感谢今天奋力拼搏的你。
ヾ(o◕∀◕)ノヾ
/**
* 游戏关卡
*/
public abstract class GameLevelHandler {
/**
* 下一个关卡
*/
protected GameLevelHandler gameLevelHandler;
/**
* 玩游戏
*/
public abstract void play();
/**
* 玩下一关
*/
protected void nextLevel() {
if (gameLevelHandler != null)
gameLevelHandler.play();// 玩下一关
}
public void setGameLevelHandler(GameLevelHandler gameLevelHandler) {
this.gameLevelHandler = gameLevelHandler;
}
}
/**
* 第一关
*/
public class FirstLevelHandler extends GameLevelHandler {
@Override
public void play() {
System.out.println("第一关 通关.......");
nextLevel();//去下一关
}
}
到此节点的生成也就差不多了。然后怎么形成链呢?咱继续……
二、如何去链
CREATE TABLE `game_level` (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`level_name` varchar(32) DEFAULT NULL COMMENT '关卡名称',
`level_id` varchar(32) DEFAULT NULL COMMENT '关卡主键id',
`prev_level_id` varchar(32) DEFAULT NULL COMMENT '上一个关卡',
`next_level_id` varchar(32) DEFAULT NULL COMMENT '下一个关卡',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='游戏关卡关联表';
INSERT INTO `game_level` VALUES ('10', '打蚊子', 'firstLevelHandler', NULL, 'secondLevelHandler');
INSERT INTO `game_level` VALUES ('11', '打酱油', 'secondLevelHandler', 'firstLevelHandler', 'thirdLevelHandler');
INSERT INTO `game_level` VALUES ('12', '打怪兽', 'thirdLevelHandler', 'secondLevelHandler', NULL);
然后怎么取,怎么关联呢?继续看代码
/**
* 按数据库关联好链条,然后返回第一关
*
* @return
*/
public GameLevelHandler getFirstLevelHandler() {
// 1.从数据库中查询出第一关
GameLevelEntity firstEntity = gameLevelMapper.getFirstLevelHandler();
// 2.获取第一关的beanId,以此获得第一关对象
String levelId = firstEntity.getLevelId();
GameLevelHandler firstLevel = SpringUtils.getBean(levelId, GameLevelHandler.class);
// 3.下一关的ID
String nextId = firstEntity.getNextLevelId();
// 4. 设置一个关卡对象标识循环时的当前关卡,类似一个指针初始指向第一关卡
GameLevelHandler tempLevel = firstLevel;
while (!StringUtils.isEmpty(nextId)) {//如果下一关ID不为空则一直取
// 5.获得下一关卡设置到当前关卡中
GameLevelHandler nextLevel = SpringUtils.getBean(nextId, GameLevelHandler.class);
tempLevel.setNextLevelHandler(nextLevel);
// 6.从数据库取出下一关卡的关联信息,看是否还有再下一关
GameLevelEntity nextEntity = gameLevelMapper.getLevelByID(nextId);
if (nextEntity == null) {//如果没有再下一关循环结束
break;
}
// 7、如果还有再下一关,赋值给缓存对象继续循环
nextId = nextEntity.getNextLevelId();
tempLevel = nextLevel;
}
return firstLevel;
}
怎么取数据库的代码,在此担心篇幅太长就不粘贴代码了,因为示例的数据库表很简单,通过判断上一关卡的ID为空就能找到第一关。核心的代码逻辑基本如上,扩展的话还可以加上缓存,修改逻辑减少查询数据库次数以增加性能。
三、优缺点
四、应用场景
全部评论