假设我有一个具有 3 个状态的元素:state1, state2, state3。最基本的流程是:
state1 -> state2 -> state3 -> state1 -> ... 等等
单击按钮时状态会更改。我实现了状态机设计模式来管理这些状态。
当然,当状态发生变化时,布局和逻辑层中的某些事情也会发生变化。问题是,我想知道 MVP 实现在这些状态更改后会是什么样子。视图更改逻辑应该放在哪里,模型更改逻辑应该放在哪里。一个基本的例子会很棒。
这是我的代码:
MainActivity.java:
StateContext stateContext;
@OnClick(R.id.button_change_state)
public void onClickChangeStateButton(View view) {
stateContext.takeAction();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
stateContext = new StateContext();
}
Run Code Online (Sandbox Code Playgroud)
StateContext.java:
public class StateContext {
private State state;
public StateContext() {
this.state = new State1();
}
public void setState(final State state) {
this.state = state;
}
public void takeAction() …Run Code Online (Sandbox Code Playgroud) 我有一个模型Enquiry,它可以处于两种状态之一(还有更多,但为了这个目的,我将只比较两个):New和Closed. 查询所处的状态取决于用户能够对查询进行什么操作。例如,不能删除已关闭的查询,而可以删除新查询等(基本示例)。
我想坚持这一点,Entity Framework但不确定如何。下面是我的代码。
询问:
public class Enquiry
{
public int Id { get; set; }
public string CustomerAccountNumber { get; set; }
public EnquiryState CurrentState { get; set; }
public bool CanAddLines { get { return CurrentState.CanAddLines; } }
public bool CanDelete { get { return CurrentState.CanDelete; } }
public void ChangeState(EnquiryState currentState)
{
CurrentState = currentState;
}
public void CloseEnquiry()
{
CurrentState.CloseEnquiry();
}
/* More methods to change state here …Run Code Online (Sandbox Code Playgroud) class HeavyweightObjcet
{
public void operate() {
System.out.println("Operating...");
}
}
class LazyInitializer
{
HeavyweightObjcet objcet;
public void operate()
{
if (objcet == null)
objcet = new HeavyweightObjcet();
objcet.operate();
}
}
Run Code Online (Sandbox Code Playgroud)
Here I'm making a virtual proxy for a heavyweight object. Each time before calling HeavyweightObject::operate, the program checks first whether the object is null or not. This part is checked once and only once through the entire lifetime of the object.
A possible improvement maybe using the state pattern …
我正在使用状态模式,但我找到的示例是出于教育目的,我想知道该模式中用于在状态之间共享对象的最佳实践是什么,即布尔值、列表以及一个状态对象来更改状态自动机对象中的引用。
我将建立一个简单的模型作为示例。
public abstract class State {
Automata automata;
public State( Automata automata){
this.automata = automata;
}
public abstract void action();
}
public class State1 extends State {
public State1(Automata automata){
super(automata)
}
@Override
public void action() {
// GET : Use obj1
// POST :Set in automata state to State2
}
}
public class State2 extends State {
public State2(Automata automata){
super(automata)
}
@Override
public void action() {
// GET :Use obj1
// POST :Set …Run Code Online (Sandbox Code Playgroud) 我在使用状态模式时遇到问题,我不知道如何在State不使用的情况下检查 a是否属于某个实例instanceOf(因为这被认为是一种不好的做法)。
TCPConnection持有一个TCPState对象。假设我想获得所有TCPConnections具有 state 的TCPEstablished。我该怎么做?

一种方法是:
public List<TCPConnection> getAllEstablished() {
List<TCPConnection> list = new ArrayList<TCPConnection>();
for(TCPConnection tcp : allConnections) {
if(tcp.getState().instanceOf(TCPEstablished)) {
list.add(tcp);
}
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
但这使用instanceOf,我宁愿不使用它。有没有更好的方法?还是我的使用instanceOf有效?
最近,我尝试在 SFML 中创建 Snake 游戏。但是,我也想用一些设计模式来为以后的编程养成一些好的习惯——那就是状态模式。但是 - 有一些我无法解决的问题。
为了让一切都清楚,我尝试制作了几个菜单——一个主菜单,还有其他的,比如“选项”,或者类似的东西。主菜单的第一个选项会将玩家带到“播放状态”。但是,问题出现了——我认为整个游戏应该是一个独立的模块来实现编程。那么,我应该如何处理程序所处的实际状态?(例如,我们将此状态称为“MainMenu”)。
我应该创建一个名为“PlayingState”的附加状态,它代表整个游戏吗?我该怎么做?如何为单个状态添加新功能?你有什么想法?
我到处都发现有人说使用状态设计模式比 if else 更好。我想知道为什么:
任何人都可以提供一个示例,其中状态模式实际上改善了这种情况,很难理解为什么当我可以使用 if-else 时我要承担遵循状态模式的开销。
互联网上的示例不足以说明这种模式如何解决现实世界的问题或使代码更易于维护。