![](/img/trans.png)
[英]How to use OR condition in JsonPath if one condition is not correct
[英]How to get the correct implementation by condition
我有三類消息。
public class ByteMessage extends Message {
private byte[] message;
private long size;
public ByteMessage() {
this.setReceiverType(ReceiverType.FILE);
}
//getters and setters
}
public class CharMessage extends Message {
private char[] message;
public CharMessage() {
this.setReceiverType(ReceiverType.FILE);
}
}
public class TextMessage extends Message {
private String message;
public TextMessage() {
this.setReceiverType(ReceiverType.DB);
}
//getters and setters
}
它們繼承自消息類Message
。
public class Message {
private ReceiverType receiverType;
public ReceiverType getReceiverType() {
return receiverType;
}
public void setReceiverType(ReceiverType receiverType) {
this.receiverType = receiverType;
}
}
該類有一個字段receiverType
,用於定義消息的寫入位置。 現在我有兩個可以記錄消息的接收器:DbReceiver 和 FileReceiver:
public class DbReceiver implements Receiver {
@Override
public void writeMessage(Message message) {
//do something
}
}
public class FileReceiver implements Receiver {
@Override
public void writeMessage(Message message) {
// do something
}
}
我有一個處理消息的服務,它應該根據消息的類型導致一個或另一個實現。 我該怎么做 - 獲得正確的實施?
public class Service {
public void handleMessage(Message message) {
Receiver receiver = ???
receiver.writeMessage(message);
}
}
我知道“地圖”的解決方案,但對我來說看起來不太好。 也許還有其他解決方案?
public class Service {
@Autowired
private Map<ReceiverType, Receiver> receiverMap;
public void handleMessage(Message message) {
Receiver receiver = getReceiver(message.getReceiverType());
receiver.writeMessage(message);
}
private Receiver getReceiver(ReceiverType receiverType){
return receiverMap.get(receiverType);
}
}
可以在ReceiverType
枚舉中提供接收器的實例:
更新:接收器的實現可以使用帶有自動裝配接收器的特殊@Component
和@PostConstruct
方法注入到枚舉值中:
public enum ReceiverType {
DB,
FILE;
private Receiver receiver = null;
private void setReceiver(Receiver receiver) {
if (null == this.receiver && null != receiver) {
this.receiver = receiver;
}
}
public Receiver getReceiver() {
return this.receiver;
}
@Component
public static class ReceiverInjector {
@Autowired
private DbReceiver db;
@Autowired
private FileReceiver file;
@PostConstruct
public void postConstruct() {
ReceiverType.DB.setReceiver(db);
ReceiverType.FILE.setReceiver(file);
}
}
}
接收器實現也應該用@Component
注釋標記:
@Component
public class DbReceiver implements Receiver {
@Override
public void writeMessage(Message message) {
//do something
}
}
@Component
public class FileReceiver implements Receiver {
@Override
public void writeMessage(Message message) {
// do something
}
}
那么該服務可以簡單地實現如下:
public class Service {
public void handleMessage(Message message) {
message.getReceiverType().getReceiver().writeMessage(message);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.