gpt4 book ai didi

java - 状态模式共享状态对象高效和可扩展实现之间的共同知识

转载 作者:行者123 更新时间:2023-11-30 06:10:56 26 4
gpt4 key购买 nike

我正在使用状态模式,但我找到的例子是出于教育目的,我想知道在这种模式中在状态之间共享对象的最佳实践是什么,即 boolean 值、列表并且一个状态对象更改自动机对象中的状态引用

我将建立一个简单的模型作为示例。

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 in automata state to State1
}
}

public class Automata {

private State state1 = new State1(this);
private State state2 = new State2(this);
private State state = state1;

public void takeAction() {
state.action()
}
}

我尝试了以下解决方案:

  1. 对于 GETobj1 存储在 Automata 中并使用 getter 和 setter。对于 POST,将状态存储在自动机中并使用 getter 和 setter。这种方法将通过使用 getter 使代码不必要地变长,并且随着 obj1 和状态的变化列表变得难以维护。
  2. 使用私有(private)内部类。将State、State1State2声明为私有(private)内部类,直接访问obj1和状态。仅仅因为文件的长度而难以维护和更新。不能与另一个 Automata 类共享。
  3. 公开字段。我不想公开所有这些字段。
  4. 使用单例/静态类方法共享obj1

我不太了解包私有(private)访问。

在我的设计中,我将此模式与模板方法模式结合起来作为辅助信息。

我知道一刀切方法不存在,但是使用这种模式的常见最佳实践是什么?

最佳答案

我会做这样的事情:

public class Automata {
List<String> someList;
boolean someBoolean;
private State currentState;

public void performAction() {
currentState = currentState.action(this);
}

interface State {
State action(Automata context);
}

enum States implements State {
IDLE {
@Override
public State action(Automata context) {
if (context.someBoolean) {
return WORKING;
}
return this;
}
},
WORKING {
@Override
public State action(Automata context) {
if (context.someList.size() > 7) {
return IDLE;
}
return this;
}
}
}
}

状态的设置现在在 AutomataperformAction() 中完成,无需在每个状态中执行此操作。我使用枚举作为状态的实现,因为当您想将状态实现为纯函数时,它们非常有用。但是,如果您的状态本身不是无状态的,您可能希望将状态实现为静态内部类。

关于java - 状态模式共享状态对象高效和可扩展实现之间的共同知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35009839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com