Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Java 切换一组函数状态的设计模式_Java_Design Patterns - Fatal编程技术网

Java 切换一组函数状态的设计模式

Java 切换一组函数状态的设计模式,java,design-patterns,Java,Design Patterns,我在一个类中有一系列实例函数。还有一个布尔实例变量指定对象状态。几乎所有的实例函数都依赖于这种布尔状态。他们的身体看起来像 int f() { if (state) { //do stuff } else { // do other stuff } } 除此之外,一些功能由状态交换。所以,若state为true,那个么当用户调用f()时,它实际上是运行的。但当state为false时,当用户调用f()时,发生的是运行antiF() 所以有些函数

我在一个类中有一系列实例函数。还有一个布尔实例变量指定对象状态。几乎所有的实例函数都依赖于这种布尔状态。他们的身体看起来像

int f() {

   if (state) {
      //do stuff
   }
   else {
      // do other stuff
   }
}
除此之外,一些功能由状态交换。所以,若state为true,那个么当用户调用f()时,它实际上是运行的。但当state为false时,当用户调用f()时,发生的是运行antiF()

所以有些函数里面有开关,有些函数完全交换

如果我用C++做这件事,我可能会使用函数指针。我将如何使用Java实现这一点?战略模式?

看起来你想要的是。不是让每个函数检查状态,而是将这些函数拉入状态接口,并为每个状态提供单独的实现:

public interface State {
  void f();
  void g();
  void h();
}

public class StateA : State {
  public void f() { do something; }
  ...
}

public class StateB : State {
  public void f() { do something else; }
  ...
}
然后,您将维护一个特定的
状态
实例,而不是布尔变量:

State currentState = new StateA();
...
currentState = new StateB();

假设StateB.g()与StateA.f()相同。有没有比只写
StateA.f(参数)更简单的解决方案?@problemofficer:在这种情况下,我会将所有单独的功能片段拉到一个单独的类中,只需从
状态
对象调用各种函数。例如,
StateB.g()
StateA.f()
都可以调用
Foo.bar()