gpt4 book ai didi

java - 什么 java 设计模式可以避免转换数据实体

转载 作者:行者123 更新时间:2023-11-30 10:08:56 26 4
gpt4 key购买 nike

我目前正在我的应用程序中实现类似异步的事件队列 - 它被设计成这样工作:一个组件对一些用户输入使用react并将事件放入队列,另一个“监听器”正在检查是否有事件队列中的特定类型并运行它自己的业务逻辑

可以有多种事件类型(如 USER_MOUSE_CLICK、USER_KEYBOARD_CLICK 等),每个实现都有自己的“事件对象”类型

它看起来像这样(我省略了构造函数 - 设置所有字段和 getters/setters - 它们只是正常的默认值):

public abstract MyEvent<T> {
private EventType eventType;
private T eventData;
}

public MouseClickEvent extends MyEvent<ClickPoint> { // ClickPoint class contains x,y of mouse click
public MouseClick(ClickPoint point) {
super(EventType.USER_MOUSE_CLICK, point);
}
}

public KeyboardClickEvent extends MyEvent<String> { // character that has been clicked on keyboard
public MouseClick(String key) {
super(EventType.USER_KEYBOARD_CLICK, key);
}
}

我还有一个带有 MyEvent 实例队列的服务,以及检索所提供的 EventType 的第一个事件的方法(如果存在)——它看起来像

...
private List<MyEvent> queue;
...
public MyEvent fetchMyEvent(EventType eventType) {
for(MyEvent event : queue) {
if(event.getEventType().equals(eventType) {
return event;
}
}
return null;
}
...

问题是,当我尝试检索事件时,我需要将其转换为特定的实现方式,例如

// some listener logic
MouseClickEvent event = (MouseClickEvent ) eventService.fetchMyEvent(EventType.USER_MOUSE_CLICK);
log("The X point of mouse click was: " + event.getEventData().x);

我不喜欢这种类型转换——我觉得在获取事件时我无法控制类型,我认为这种情况就像一个“弱点”和错误生成器。是否有任何设计模式可以避免这种情况,或者我应该重新设计整个系统?或者也许这是唯一的方法,我不应该在意

最佳答案

我建议您使用访问者模式以避免转换。您说得对,应谨慎使用类型转换。

要使用访问者模式,您必须:第一:定义访客界面:

public interface IEventVisitor {

void visit(MouseClickEvent event);

void visit(KeyboardClickEvent event);

}

第二个在你的晚餐类中定义一个抽象方法接受为:

public abstract MyEvent<T> {
private EventType eventType;
private T eventData;

public abstract void accept(IEventVisitor visitor);
}

第三:实现每个子类的方法为:

public MouseClickEvent extends MyEvent<ClickPoint> { // ClickPoint class contains x,y of mouse click
public MouseClick(ClickPoint point) {
super(EventType.USER_MOUSE_CLICK, point);
}

public void accept(IEventVisitor visitor) {
visitor.visit(this);

}
}

最后实现您的访客界面。

使用会像下面这样,实例化访问者并调用event.accept(visitor)。

Event event = eventService.fetchMyEvent(EventType.USER_MOUSE_CLICK);
IEventVisitor visitor = new IEventVisitor() {

@Override
public void visit(MouseClickEvent event) {
// logic goes here
}

@Override
public void visit(KeyboardClickEvent event) {
// logic goes here
}
};


event.accept(visitor);

关于java - 什么 java 设计模式可以避免转换数据实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53536253/

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