繁体   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