gpt4 book ai didi

java - 根据 "foreign"子类型采取具体行动,无开关、转换等。我们能以某种方式使用多态性吗?

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:02 25 4
gpt4 key购买 nike

我遇到过很多次类似的问题,但还没有找到好的解决方案。下面是一个具体的例子,我现在正在努力解决这个问题,但这个问题实际上是普遍的。

假设我们有一些应用程序从串行端口监听二进制数据,对其进行解码,并在需要时发回一些数据。这是核心功能,由一种“核心”模块完成。

这个核心模块发出事件。有一个抽象类型Event,里面包含了事件时间等一些公共(public)数据,还有一些Event的子类:比如有一个事件EventRawData 是在接收到任何原始数据时发出的,EventMessage 是在消息被解码或发送时发出的。

有 GUI 监听这些事件,并在事件发生时采取一些行动。当然,具体的操作取决于具体的事件类型。问题是如何根据事件类型采取特殊行动。 Event 本身完全不知道任何类型的 GUI(也不应该知道),因此,我无法向显示此事件的 Event 添加一些虚拟方法不知何故。

天真的方法是使用某种switch:在C++中我们会使用dynamic_cast,在Java中它会是instanceof,等等.这是我以前做过的,我不喜欢:

if (my_event instanceof EventRawData){
// ...
} else if (my_event instanceof EventMessage){
// ...
}

我能想到的是:

也许我们可以为 GUI 发明一些接口(interface),每个特定的 GUI 都应该实现这个接口(interface)。然后,每个事件都可以有 show() 方法:

abstract class Event {
// ...
abstract void show(GuiAbstract gui);
// ...
}

并且当这个方法被某个特定的 GUI 调用时,GUI 应该在那里传递 this。这可能就是现在所谓的“依赖注入(inject)”。

嗯,我也不喜欢这样:我希望 Event 完全不知道 GUI。

或者,也许最好摆脱基类 Event,让每个事件完全独立于类,并分别监听它们。我也不喜欢它:我真的希望所有事件都有一些通用数据(例如事件时间)。

也许有一些我不知道的设计模式?感谢您的帮助。

最佳答案

如果您将 UI 与域完全分离,则必须在域和 UI 之间的某处有一个类型条件树。然而,一种选择是“隐藏”工厂中的条件树,并生成以多态方式工作的事件的“ View 模型”:

// DOMAIN LAYER

public class Event {
// some data, completely agnostic of UI
}


// USER INTERFACE LAYER

public abstract EventViewModel {
void show();
}

public class EventViewModelFactory {
EventViewModel createFrom(Event event) {
if (event instanceof EventA) {
return EventAViewModel((EventA)event);
}
else if (event instanceof EventB) {
return EventBViewModel((EventB)event);
}
//etc...
}
}

关于java - 根据 "foreign"子类型采取具体行动,无开关、转换等。我们能以某种方式使用多态性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31029783/

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