训练残骸模式– Java 8中的改进实现

Venkat Subramaniam在今天的演讲中提到了有关“级联方法”模式或“火车残骸”模式的内容,如下所示:

>someObject.method1().method2().method3().finalResult()

很少有人会将此与构建器模式相关联,但事实并非如此。 无论如何,让我们看一下Java中没有使用lambda表达式的示例:

public class TrainWreckPattern {
  public static void main(String[] args) {
    new Mailer()
    .to("to@example.com")
    .from("from@exmaple.com")
    .subject("Some subject")
    .body("Some content")
    .send();

  }
}

class Mailer{
  public Mailer to(String address){ 
    System.out.println("To: "+address); 
    return this;
  }
  public Mailer from(String address){ 
    System.out.println("From: "+address); 
    return this;
  }
  public Mailer subject(String sub){ 
    System.out.println("Subject: "+sub); 
    return this;
  }
  public Mailer body(String body){ 
    System.out.println("Body: "+body); 
    return this;
  }
  public void send(){ 
    System.out.println("Sending ..."); 
  }
}

我以Venkat Subramaniam的讲话为例。 在上面的代码中,我有一个Mailer类,该类接受一系列值,即:to,from,subject和body,然后发送邮件。 很简单吧? 但是与此有关的一个问题是:一个Mailer对象完成发送邮件后,便不知道该如何处理。 可以重新使用它来发送另一封邮件吗? 还是应该知道电子邮件的发送状态? 这在上面的代码中是未知的,很多时候人们无法在文档中找到此信息。 如果我们可以将Mailer对象的范围限制在某个块之内,以便一旦操作完成就无法使用它,该怎么办?

Java 8提供了一种使用Lambda表达式实现此目标的出色机制。 让我们看看如何做到这一点:

public class TrainWreckPatternLambda {

  public static void main(String[] args) {
    Mailer.send( mailer -> {
      mailer.to("to@example.com")
            .from("from@exmaple.com")
            .subject("Some subject")
            .body("Some content");
    });
  }

}

class Mailer{

  private Mailer(){

  }
  public Mailer to(String address){ 
    System.out.println("To: "+address); 
    return this;
  }
  public Mailer from(String address){ 
    System.out.println("From: "+address); 
    return this;
  }
  public Mailer subject(String sub){ 
    System.out.println("Subject: "+sub); 
    return this;
  }
  public Mailer body(String body){ 
    System.out.println("Body: "+body); 
    return this;
  }
  public static void send(Consumer<Mailer> mailerOperator){ 
    Mailer mailer = new Mailer();
    mailerOperator.accept(mailer);
    System.out.println("Sending ..."); 
  }
}

在上述实现中,我通过将构造函数设为私有,将Mailer类的实例化限制为send()方法。 然后send()方法现在接受Consumer接口的实现,该接口是Single Abstract方法类,可以用Lambda表达式表示。 在main()方法中,我传递了一个lambda表达式,该表达式接受Mailer实例,然后在将其用于send()方法之前配置mailer对象。

lambda表达式的使用为Mailer对象的使用创建了明确的界限,这样,对于阅读有关如何使用Mailer对象的代码的人来说,它的含义就更加清晰了。

让我知道在我分享的这个示例中是否还有其他可以改进的地方。


翻译自: https://www.javacodegeeks.com/2013/05/train-wreck-pattern-a-much-improved-implementation-in-java-8.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值