流畅的消息发送者界面

问题描述 投票:0回答:1

我想为消息发送者创建流畅的 API。让我们举个简单的例子。

messageSender.newMessage()
    .withSomeField("some value")
    .withAnotherField("some value")
.publish();

我有课程

messagePublisher
message
messagePublisher
有方法
publish(message)
。我如何将这一切包装在一起以实现如上所述的流畅方式?

我提出了解决方案,其中我有类“messageSender”,其中包含“messagePublisher”的实例并使用它来发布消息。当我调用

messageSender.newMessage()
时,它将返回
messageBuilder
,但是这个
messageBuilder
需要引用 messageSender,所以我能够调用publish() 方法。我不喜欢
messageBuilder
尊重
messageSender
,但我不知道如何以不同的方式做到这一点。

预先感谢您的任何帮助或建议!

java fluent
1个回答
0
投票

您可以使用 MessageSender 的内部类:

MessageSender.java:

public class MessageSender {
  private MessagePublisher messagePublisher;
  public void setPublisher(MessagePublisher publisher) {
    this.messagePublisher = publisher;
  }
  public static void main(String[] args) {
    MessageSender messageSender = new MessageSender();
    messageSender.setPublisher(new MessagePublisher());
    messageSender.newMessage()
      .withDestination("DEST")
      .withMsg("message")
      .publish();
  }

  public MessageBuilder newMessage() {
    return new MessageBuilder();
  }

  class MessageBuilder {
    private Message message = new Message();

    public MessageBuilder withMsg(String msg) {
      message.setMsg(msg);
      return this;
    }

    public MessageBuilder withDestination(String destination) {
      message.setDestination(destination);
      return this;
    }

    public void publish() {
      messagePublisher.publish(message);
    }
  }
}

MessagePublisher.java:

public class MessagePublisher {
  public void publish(Message message) {
    System.out.println(
      String.format(
        "Message to be sent: Msg=%s, Dest=%s", 
        message.getMsg(),
        message.getDestination()
      )
    );
  }
}

Message.java:

public class Message {
  private String msg;
  private String destination;

  public void setMsg(String msg) {
    this.msg = msg;
  }

  public void setDestination(String destination) {
    this.destination = destination;
  }

  public String getMsg() {return this.msg;}
  public String getDestination() {return this.destination;}
}
© www.soinside.com 2019 - 2024. All rights reserved.