微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

@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;

}

现在我想将电梯的行为与模型分开,我想创建另一个类,也许它将实现 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());
        }
    }

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

先谢谢你!

解决方法

我认为您的代码看起来不错。重点是在行为类中没有状态。你不需要设计模式。嗯,实际上,你已经用过一个:组合。

由于“电梯本身向上/向下移动”(这意味着逻辑将进入 Elevator)或“控制器处理电梯的移动”,因此可以过度扩展这种特定情况,在这种情况下,{ {1}} 类可以具有该行为。

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

,

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

我也觉得 Runnable 的名字令人困惑。 Runnable 意味着该类可用于运行某些代码。例如,接口 Runnable (https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Runnable.html) 可以扩展为由 Thread 运行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。