基于消息类型处理不同消息的设计模式

时间:2019-07-30 23:00:51

标签: design-patterns lambda java-8

我需要处理被推送到我的应用程序的通知消息。其中消息包含通知类型,例如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
} 

2 个答案:

答案 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。