public enum MessageType {
TYPE_A,
TYPE_B,
TYPE_C,
;
}
public interface MqSenderStrategy extends InitializingBean{
void send(String message);
}
public abstract class AbstractMqSenderStrategy implements MqSenderStrategy {
protected abstract MessageType getMessageType();
// 使用生命周期方法注册到工厂类中
// 也可以使用@PostConstuct
@Override
public void afterPropertiesSet() throws Exception {
MqSenderStrategyFactory.registrySender(getMessageType(), this);
}
/**
* 发送模板代码封装
*/
@Override
public void send(String message) {
// Connection c = new Connection(); 创建连接
// c.connect()
doSend(message);
// c.disconnect(); 断开连接
}
protected abstract void doSend(String message);
}
@Component
public class ASenderStrategy extends AbstractMqSenderStrategy {
@Override
protected MessageType getMessageType() {
return MessageType.TYPE_A;
}
@Override
public void doSend(String message) {
}
}
public class MqSenderStrategyFactory {
private static final ConcurrentHashMap<MessageType, MqSenderStrategy> SENDER_MAP;
static {
SENDER_MAP = new ConcurrentHashMap<>(MessageType.values().length);
}
public static void registrySender(MessageType messageType, MqSenderStrategy mqSenderStrategy) {
if (messageType == null) {
throw new RuntimeException("注册Sender到Factory失败,消息类型不可为null");
}
if (SENDER_MAP.get(messageType) != null) {
throw new RuntimeException("相同类型的消息处理策略只能注册到Factory一次");
}
SENDER_MAP.put(messageType, mqSenderStrategy);
}
public static MqSenderStrategy getSender(MessageType messageType) {
return SENDER_MAP.get(messageType);
}
}
public interface MqSenderStrategy {
MessageType getMessageType();
void send(String message);
}
@Component
@Order(1)
@Lazy
public class ASenderStrategy extends AbstractMqSenderStrategy {
@Override
protected MessageType getMessageType() {
return MessageType.TYPE_A;
}
@Override
public void doSend(String message) {
}
}
public class MqSenderStrategyFactory {
@Autowried
private List<MqSenderStrategy> sendList;
private static final ConcurrentHashMap<MessageType, MqSenderStrategy> SENDER_MAP;
static {
SENDER_MAP = new ConcurrentHashMap<>(MessageType.values().length);
}
// 工厂对象创建完毕,初始化策略工厂
@PostConstruct
public void registrStrategy() {
sendList.forEach(e - > SENDER_MAP.put(e.getMessageType()));
}
public static MqSenderStrategy getSender(MessageType messageType) {
return SENDER_MAP.get(messageType);
}
}