【问题标题】:Which design pattern will be most appropriate to be used to separate model from behavior?哪种设计模式最适合用于将模型与行为分开?
【发布时间】:2021-05-13 12:35:08
【问题描述】:

我有类 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() 方法等分开。它应该是装饰器吗?

提前谢谢你!

【问题讨论】:

    标签: java design-patterns decorator command-pattern


    【解决方案1】:

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

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

    【讨论】:

    • 是的,你是对的,我也知道 Runnable 是什么,我已经把它改成了 ElevatorController 之类的东西
    【解决方案2】:

    我认为您的代码看起来不错。关键是在行为类中没有状态。你不需要为此设计模式。好吧,实际上,您已经使用了一个:组合。

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

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

    【讨论】:

    • 好的!那就谢谢你了,我也会把本地化移到控制器上。干杯!
    • @MrFisherman,请注意,将状态与行为分离不是面向对象的编程,因此没有任何 GoF 设计模式适用,因为这些都是面向对象的模式。 The difference between object-oriented programming and procedural programming 是 OO 将状态和行为组合到一个实体(对象)中。如果你想写程序代码,完全没问题;但你会想寻找程序模式而不是 GoF 模式。
    • @jaco0646 我们不是在 mvc 中将模型与控制器分开吗?还是像春季服务中的实体?
    • @MrFisherman,你完全正确。在企业(Java)编程中,很多(大部分)代码是过程性的,服务/实体分离是最常见的模式。服务 == 程序(所有逻辑无数据)。实体 == 数据结构(所有数据无逻辑)。开发人员往往不会考虑这一点,但 OOP 在企业 Java 中相对较少(并且随着函数式编程的日益普及而变得越来越少)。请注意,原始 MVC 架构(不是 Spring)中的模型是一个包含应用程序所有业务逻辑的丰富对象。
    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多