Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于给定状态委派调用的模式_Javascript_Node.js_Design Patterns - Fatal编程技术网

Javascript 基于给定状态委派调用的模式

Javascript 基于给定状态委派调用的模式,javascript,node.js,design-patterns,Javascript,Node.js,Design Patterns,我在想一个我可以使用的模式 我希望能够有一个中间人模块,在一个游戏的一种状态采取。给定该状态,调用驻留在anotehr模块中的特定方法 我可以用什么样的图案 例如,我希望能够接受“计算机总是赢”的状态,并基于该状态类型,调用someOtherModule.makeComputerMove()。在未来,我们可能希望能够将游戏设置为一种电脑并不总是赢的模式。然后我们可以发送一个状态为“普通游戏”或类似的东西,从不同的用例模块调用computerAlwaysWins.makeComputerMove(

我在想一个我可以使用的模式

我希望能够有一个中间人模块,在一个游戏的一种状态采取。给定该状态,调用驻留在anotehr模块中的特定方法

我可以用什么样的图案

例如,我希望能够接受“计算机总是赢”的状态,并基于该状态类型,调用
someOtherModule.makeComputerMove()
。在未来,我们可能希望能够将游戏设置为一种电脑并不总是赢的模式。然后我们可以发送一个状态为“普通游戏”或类似的东西,从不同的用例模块调用
computerAlwaysWins.makeComputerMove()
,例如
normalGame.makeComputerMove()

明白了吗


我想不出任何模式可以提供这样的东西……可能是因为我对它们了解不多。

您应该将状态模式与观察者组合使用

public class GameStateContext {
    PlayerState Player {get;set; }
    // other properties that need to be shared
}

public interface IGameController {
    void GoToState(State state)
}

public interface IGameState {
   void Start();
   void Update();
}

public abstract class GameStateBase : IGameState {
    protected GameStateContext _context;
    protected IGameController _parent;

    public GameStateBase(GameStateContext context, IGameController parent) {
        this._context = context;
        this._parent = parent;    
    }

    public virtual void Start() {

    }

    public virtual void Update() {

    }
}

public class BonusLevelState : GameStateBase {
   public public MainMenuState (GameStateContext context, IGameController parent) : base (context, parent) {

   }

   public override void Update() {
       if(_context.Player.Health == 0) {
           _parent.GoToState(GameStates.GameOver);
       }
   }
}

public GameController : IGameController {
    public enum GameStates {
        BonusLevel,
        InitialState,
        ....
    }

    private IGameState currentState;

    public GameController() {
        // create diferent states
        ...
        currentState = GetState(GameStates.InitialState);
    }

    public void Update {
       currentState.Update();
    }

    public GoToState(State state) {
        currentState = GetState(state);
    }
}

我希望你有个主意,祝你好运

州模式听起来足够好吗?谷歌是你的朋友。