PortListener 是一个抽象类。方法 listen()、close()、readMessage()、sendMessage() 是抽象的,应该在子类中实现。这些方法应该创建低级操作,例如打开连接或从端口读取字节。我不想在我的基类中混合那种细节——我只想要那里的业务逻辑——方法 onMessageReceived() 这是我的业务逻辑。它创建特定的响应,将数据保存到数据库,更改其他对象等。
PortListenerImp 是一个具体的类。它实现了所有需要的方法。每当收到新消息时,我很想“强制” PortListenerImp 使用父母的 onMessageReceived() 。
我认为如果不了解抽象 PortListener 类中 SerialPortListener 的具体细节,就没有简单的方法。我所做的就是让实现类中应该调用什么方法更加明显。我已将 Event 参数添加到 PortListener 类并添加了 onEvent() 方法。方法 readMessage 也应该询问 Event 对象。因此,通过这种设计,更清楚的是 PortListenerImp 应该使用 onEvent 作为事件处理程序:
public abstract class PortListener<Event> {
private final String portName;
public abstract void listen();
public abstract void close();
abstract Message readMessage(Event event);
abstract void sendMessage(Message message);
public final void onEvent(Event event) {
Message message = readMessage(event);
onMessageReceived(message);
}
private void onMessageReceived(Message message) {
// some business logic here
}
}
public class SerialPortListener extends PortListener<SerialPortEvent> {
private final SerialPort serialPort;
@Override
public void listen() {
if(!tryToOpenPortAndSetParameters())
throw new PortOpenException(getPortName());
tryToAddListener();
}
private boolean tryToOpenPortAndSetParameters() {
// return tryToOpenPort() && setPortParameters();
}
@Override
public void close() {
if(!tryToRemoveListenerAndClosePort())
throw new PortCloseException(getPortName());
}
private boolean tryToRemoveListenerAndClosePort() {
// return tryToRemoveListener() && tryToClosePort();
}
@Override
void sendMessage(Message message) {
// send messsage
}
@Override
Message readMessage(SerialPortEvent serialPortEvent) {
if (serialPortEvent.getEventValue() > 0)
return tryToReadMessage();
return Message.EMPTY;
}
private void tryToAddListener() {
try {
serialPort.addEventListener(this::onEvent);
} catch (SerialPortException e) {
throw new PortOpenException(getPortName(), e.getMessage());
}
}
private Message tryToReadMessage() {
// read message
}
}
请评论您对此设计的看法。源代码被最小化只是为了使其更清晰。