哪种设计模式最适合用于将模型与行为分开?

Which design pattern will be most appropriate to be used to separate model from behavior?

我有 class 电梯,其中包含有关电梯本身的基本信息。喜欢这里:

@Builder
@Getter
@Setter
public class Elevator {

private final int id;
private final float maxSpeed;
private final float maxLiftingCapacity;
private float currentSpeed;
private float currentConditionFactor;
private Dimensions dimensions;
private Localization localization;

}

现在我想将电梯的行为与模型分开,我想创建另一个class,也许它会实现 Runnable 或 Callable(现在无所谓,它应该是通用的)。它会有这样的方法(原型):

public class ElevatorRunnable implements Sleepable {

    private final Elevator elevator;

    public ElevatorRunnable(Elevator elevator) {
        this.elevator = elevator;
    }

    private void moveUp() {
        float posY = elevator.getLocalization().getY();
        if (posY >= elevator.getBuilding().getGroundHeight()) {
            elevator.getLocalization().setY(posY - elevator.getCurrentSpeed());
        }
    }

    private void moveDown() {
        float posY = elevator.getLocalization().getY();
        if (posY <= elevator.getBuilding().getHeight()) {
            elevator.getLocalization().setY(elevator.getLocalization().getY() + elevator.getCurrentSpeed());
        }
    }

我真的不认为现在这样是正确的,所以我的问题是,我应该使用哪种模式来将对象的信息与 运行() 方法等分开。应该是 Decorator 吗?

提前致谢!

我觉得你的代码看起来不错。重点是在行为 classes 中没有状态。而且您不需要为此设计模式。嗯,其实你已经用过一个:composition.

由于“电梯本身移动 up/down”(这意味着逻辑将进入 Elevator)或“控制器处理电梯的移动”,因此这种特定情况可能会过度扩展Controller class 可以有这种行为。

也可以讨论 localization 字段,因为位置实际上不是电梯属性,而是控制器属性。

在某些情况下,将行为转移到其他地方是有意义的。在这种情况下,我认为将所有内容都放在一个 class 中更有意义。电梯具有给定的属性,可以上下移动。没必要把事情搞复杂。

我也觉得名字 Runnable 令人困惑。 Runnable 意味着 class 可以用于 运行 一些代码。例如,接口 Runnable (https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Runnable.html) 可以通过 Thread.

扩展为 运行