我需要处理被推送到我的应用程序的通知消息。其中消息包含通知类型,例如catalog_purchased, catalog_expired, catalog_denied
等,并且将来还会添加新的一组通知类型。
能够基于通知类型而不是仅使用if-else块来处理所有这些消息的最佳设计模式(以及Java 8的任何功能)是什么?
public class CustomMessage(){
private String messageType;
private Message message;
}
public void pushedMessage(CustomMessage message){
//*TO-DO* need to implement code that handles one message at a time
}
答案 0 :(得分:1)
我认为最好的设计模式是工厂模式。因为客户不知道基于数据输入将调用哪个服务或方法。尽管您可以使用Java 8功能,但我只是提供了一个示例。 there is a good sample。
首先定义一个接口:
public interface MessageProcess {
public void pushedMessage(CustomMessage message);
public String messageType();
}
并假设您将具有以下流程服务:
public class ServiceA implements MessageProcess{
@Override
public void pushedMessage(CustomMessage message) {
}
@Override
public String messageType() {
return "messageType1";
}
}
,还有:
public class ServiceB implements MessageProcess {
@Override
public void pushedMessage(CustomMessage message) {
System.out.println("pushed message by serviceB: " + message.toString());
}
@Override
public String messageType() {
return "messageType2";
}
}
现在您可以创建一个Factory类,该类根据消息类型来标识指定的服务。
public class MessageFactory {
public MessageProcess getByType(String messageType) {
if (messageType.equals("messageType1"))
return new ServiceA();
else if (messageType.equals("messageType2"))
return new ServiceB();
return null;
}
}
现在我们使用它像这样:
public class MessageProcessTest {
public static void main(String[] args) {
MessageFactory messageFactory = new MessageFactory();
messageFactory.getByType("messageType2").pushedMessage(new CustomMessage("catalog1"));
}
}
答案 1 :(得分:0)
您可以创建一个以消息类型为键,处理逻辑为值的映射
public static Map<String, Processor> PROCESSORS_MAP = Map.of(
"catalog_purchased", customMsg -> System.out.println("catalog_purchased: " + customMsg),
"catalog_expired", customMsg -> System.out.println("catalog_expired: " + customMsg),
"catalog_denied", customMsg -> System.out.println("catalog_denied: " + customMsg)
);
其中Processor
是功能接口
@FunctionalInterface
interface Processor {
void process(CustomMessage msg);
}
并按以下方式使用
PROCESSORS_MAP.get(customMessage.getMessageType()).process(customMessage);
当然,如果处理消息的逻辑很大,则应该创建一个实现Processor
的类,而不要使用lambda。