哪种设计模式最适合用于将模型与行为分开?
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
.
扩展为 运行
我有 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
.