java - 动态行为如何改变 Java 中的状态?

标签 java oop strategy-pattern

我正在与我的 Java 类(class)中的学生一起研究一个类似 Zork 的简单环境,在该环境中,玩家从一个位置到另一个位置遇到元素。这些项目应该有动态行为,这样一本书在你烧掉它之前是可读的,或者鸭子可以飞,直到它飞得太久而疲惫不堪。等等。

我和学生们已经掌握了基本的策略模式(我改编自 Head First Design Patterns,并省略了样板文件):

public class Duck {

   String name;
   Int health;
   FlyBehavior flyBehavior;

   public void performFly() {
      flyBehavior.fly();
   }

   public void setFlyBehavior(FlyBehavior f) {
      flyBehavior = f;
   }
}

public interface FlyBehavior {
   public void fly();
}

public class FlyGracefully implements FlyBehavior {
   public void fly() {
      System.out.println("I fly so gracefully!");
   }
}

public class TooTiredToFly implements FlyBehavior {
   public void fly() {
      System.out.println("I'm too tired to fly.");
   }
}

保留 main 方法的细节,这让我们可以将不同的飞行行为切换到我们的 Duck 中。这很容易,因为它返回一个空值并打印到系统输出。

但是如果我们需要行为与 Duck 的状态交互怎么办?比方说:

  • 当鸭子累得飞不起来时,它的名字就会变成“Exhausted Duck”。其他行为也可以更改其名称。
  • 当鸭子受到攻击(会发生)时,它的生命值会下降。当它的健康状况太低时,它的 flyBehavior 会切换到 TooTiredToFly 行为。

但我假设动态行为,至少在这种模式下,无法访问它们所在对象的状态。

是否有一个通用的策略来创建与它们所在的对象的状态交互的动态行为?我想教一些可以理解的东西,所以把自己放在中级高中程序员的脑海里。

最佳答案

根据我上面的评论,有些事情是这样的......

// Creating an interface for flyable things e.g. Duck, Airplane, etc.
// You don't have to do this. You could just pass your Duck
// object instead and call its methods directly.
public interface Flyable {
    void performFly();
}

public class Duck implements Flyable {
    // All your Duck stuff as above in here.
}

public abstract class FlyBehavior {
    private Flyable parent;

    public FlyBehavior(Flyable parent) {
        this.parent = parent;
    }

    public abstract void fly();

    protected Flyable getParent() {
        return this.parent;
    }
}

public class FlyGracefullyBehavior extends FlyBehavior {
    public FlyGracefullyBehavior(Flyable parent) {
        super(parent);
    }

    @Override
    public void fly() {
        // Now you can get access to the original parent here.
        Flyable parent = this.getParent();
    }
}

public class TooTiredToFlyBehavior extends FlyBehavior {
    public TooTiredToFlyBehavior(Flyable parent) {
        super(parent);
    }

    @Override
    public void fly() {
        // Now you can get access to the original parent here.
        Flyable parent = this.getParent();
    }
}

或者,您可以简单地在 FlyBehavior 类的 fly 方法中传递父状态,即 behavior.fly(state); 这取决于您:)

关于java - 动态行为如何改变 Java 中的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37033361/

相关文章:

java - 相同的类调用在 Spring AOP cglib 中无效

java - 在 Java 中检查对象是否为 null

design-patterns - 策略模式和委托(delegate)模式的区别

java - 使用设计模式时,您可以在多大程度上防止修改现有代码?

java - 执行 getContentResolver().Insert

java - 无法将对象数组转换为另一个接口(interface)的数组

python - 将类转换为模块 Python3

PHP PDO 潜在的逻辑错误

Java `final` 方法 : what does it promise?

java - 如何避免在策略模式中使用 java 和泛型进行未经检查的强制转换