我有以下旨在模拟游戏状态的状态
enum GameStates{ Bet, CompleteBet, Bonus,CompleteBonus, Jackpot, CompleteJackpot }
只有Bet
状态是游戏的外部(可以从外部触发(。每个其他状态都是内部的,这是由游戏本身触发的。
如果我处于CompleteBet
状态,则游戏可以继续进行Bonus
状态,但也可以返回到Bet
状态(这是每场游戏配置(。
在CompleteBonus
状态下重复相同的情况。该游戏可以自行运输到Bet
或Jackpot
状态。
现在,我正在使用以下if - else
Logic
// In CompleteBet state
if (bonus.isEnabled) {
setState(Bonus);
} else {
if (jackpot.isEnabled) {
setState(Jackpot);
} else {
setState(Bet);
}
// in CompleteBonus state
if (jackpot.isEnabled) {
setState(Jackpot);
} else {
setState(Bet);
}
}
,但显然这不是很好的解决方案。也许我需要重新设计我的状态机器?任何建议都会被赞赏
编辑: 实际上GameState
枚举的定义是如此:
enum GameState implements TransferState {
WITHDRAW {
@Override
public void initiateStep(final GameContext context) {
//some logic which triggers complete transfer
}
},
COMPLETE_WITHDRAW {
@Override
public void completeTransfer(final GameContext context) {
// if bonus is enabled;
if (true) {
context.setState(BONUS);
} else {
// if remote gaming is on
if (true) {
context.setState(REMOTE_GAME);
} else {
context.setState(WITHDRAW);
}
}
}
}
// ...
}
initiateTransfer
和completeTransfer
定义为TransferState
接口中的default
方法。
在这种情况下,我将使用状态模式与 cain of Parsive Pattern ,并为您的情况
您的游戏
public class Game{
private IState state = new StateReady();
public void play(){
state.play(this);
}
public void setState(IState state){
this.state = state;
}
}
状态
public StateReady implements IState{
private List<IGameHeadler> headler = new ArrayList<>();
public StateReady(){
headler.add(new BonusHeadler());
headler.add(new JackpotHeadler());
}
public void play(Game game){
//Your operation
//an example the operation is
Iterator iterator = headler.iterator();
boolean flag = false;
while(iterator.hasNext() && !flag){
IGameHeadler headler = (IGameHeadler)iterator.next();
flag = headler.doChain();
}
game.setState(new WaitState(game));
}
}
公共接口
public interface IGameHeadler{
boolean doChain();
}
public interface IState{
void play(Game game);
}
但是游戏的状态会更改为
- 外部线程
- 游戏类
- 另一种状态
- 任何对象,模式都是一个为已知问题提供解决方案的想法,但是可以根据情况扩展此想法
另外,责任链模式是将您的逻辑划分为更多headler的很酷的模式,在您的情况下,一个主人是If()
另外,我偏好使用另一个模式来创建状态,一个状态是唯一的, flyweaight模式解决此问题,我将删除enum