簡體   English   中英

如何按條件獲得正確的實現

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM