gpt4 book ai didi

java - 设计具有通用接口(interface)但不同行为的类

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

我将这个问题同时标记为 Java 和 Scala,因为虽然我主要在 Java 上进行开发,但我想看看 Scala 上的解决方案是否会有所不同。

我在为我的应用程序设计类时遇到了问题。我有一组具有不同行为的常见对象。正如我最近读到的一些关于模式的书所说:“好吧,我可以在这里使用策略模式”,将行为定义为某个字段对象并将所有逻辑委托(delegate)给它。这是我的问题开始:)

假设我有一个可以飞行的基类 Duck,我将飞行委托(delegate)给某些 FlyBehaviour。

interface IFlyable { void fly(); }

interface IFlyBehaviour { void fly(); }

class Duck implements IFlyable {
IFlyBehaviour flyBehaviour;

void fly() {
flyBehaviour.fly();
}
}

但我的鸭子有点不同,我意识到我希望行为依赖于它。首先,我有一个 SpaceDuck,它应该在太空中飞行,并使用仅为 SpaceDuck 定义的 spaceShip 字段。接下来我有一个 HelicopterDuck,我希望它飞得尽可能低,并使用一些仅为 HelicopterDuck 定义的防空照明弹。所以在代码中是这样的

class SpaceDuck extends Duck {
String spaceship;
}

class SpaceFlyBehaviour implements IFlyBehaviour {
void fly() {
System.out.println("Flying in space on spaceship: " + spaceduck.spaceship);
}
}

class HelicopterDuck extends Duck {
int flares;
}

class HelicopterFlyBehaviour implements IFlyBehaviour {
void fly() {
while(helicopterduck.flares > 0) {
System.out.println("I'm going low and using flares");
helicopterduck.flares--;
}
}
}

在我的行为实现中,我实际上没有对 spaceduck 或 helicopterduck 的引用,并且此代码无法编译。我只是提供了一个示例,说明我的想象和希望的样子。我可以修改 IFlyBehaviour 并将 duck 作为参数传递给 fly() 方法,但随后我必须向下转换才能访问 duck 特定字段,我想这不是一个好主意。

看起来显而易见的方法就是放弃 IFlyBehaviour 并将逻辑移至每只鸭子的 fly() 方法。但我预计会有很多不同的太空飞行行为和直升机行为,而 fly() 并不是唯一的方法。它将是 squack()、run() 等,每个都有不同的行为集。所以我的类层次结构将变得庞大且无法支持。

在我的实际应用程序中,我将有一些可以以不同方式运行和停止的可运行和可停止实例。一个实例将通过 SSH 脚本启动,另一个实例将通过 MBean(或 SSH,这取决于用户如何配置它)启动,第三个实例将使用某些第 3 方等。所以我希望 Duck 示例能够很好地反射(reflect)我的问题。

任何将我推向正确方向的想法都会非常有帮助。提前致谢!

最佳答案

在 Scala 中,traits只是为了这种东西而被包括在内。

在Java中,就更难了。我会尝试摆脱鸭子子类而不是行为,将特定于类型的属性移到行为类中。如果您仅通过它们的通用接口(interface)使用鸭子,那么这些属性无论如何都不可用 - 它们应该只在实例化时可见。

关于java - 设计具有通用接口(interface)但不同行为的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9688979/

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