目录

通过行为参数化传递代码

目录

本章内容

  • 应对不断变化的需求
  • 行为参数化
  • 匿名类
  • Lambda表达式预览
  • 真实示例:Comparator、Runnable和GUI

行为参数化就是可以帮助你处理频繁变更的需求的一种软件开发模式。一言以蔽之,它意味 着拿出一个代码块,把它准备好却不去执行它。这个代码块以后可以被你程序的其他部分调用, 这意味着你可以推迟这块代码的执行。例如,你可以将代码块作为参数传递给另一个方法,稍后 再去执行它。这样,这个方法的行为就基于那块代码被参数化了。

你可能 已经用过了行为参数化模式——使用Java API中现有的类和接口,对List进行排序,筛选文件名, 或告诉一个Thread去执行代码块,甚或是处理GUI事件。你很快会发现,在Java中使用这种模式 十分啰嗦。Java 8中的Lambda解决了代码啰嗦的问题。我们会在第3章中向你展示如何构建Lambda 表达式、其使用场合,以及如何利用它让代码更简洁。


一种软件工程原则:

DRY:Don’t Repeat Yourself,不要重复自己


行为参数化和策略模式有着相同的设计理念,它让你定义一族算法,把它们封装起来(称为“策略”),然后在运行时选择一个算法。

行为参数化:让方法接受多种行为(或战 略)作为参数,并在内部使用,来完成不同的行为。

多种行为,一个参数

行为参数化的好处在于你可以把迭代要筛选的集合的逻辑与对集合中每个元素应用的行为区分开来。这样你可以重复使用同一个方法,给它不同的行为来达到不同的目的。


匿名类

匿名类和你熟悉的Java局部类(块中定义的类)差不多,但匿名类没有名字。它允许你同时 声明并实例化一个类。换句话说,它允许你随用随建。


真实的例子

行为参数化是一个很有用的模式,它能够轻松地适应不断变化的需求。这 种模式可以把一个行为(一段代码)封装起来,并通过传递和使用创建的行为(例如对Apple的 不同谓词)将方法的行为参数化。前面提到过,这种做法类似于策略设计模式。

  • 用 Comparator 来排序

  • 用 Runnable 执行代码块

  • GUI 事件处理

    1
    2
    3
    4
    5
    6
    7
    
    Button button = new Button("Send"); button.setOnAction(new EventHandler<ActionEvent>() {
      
      public void handle(ActionEvent event) {
      
      label.setText("Sent!!");
      
    } });
    

小结

以下是你应从本章中学到的关键概念。

  • 行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用它们,完成不同行为的能力。

  • 行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量。

  • 传递代码,就是将新行为作为参数传递给方法。但在Java 8之前这实现起来很啰嗦。为接口声明许多只用一次的实体类而造成的啰嗦代码,在Java 8之前可以用匿名类来减少。

  • Java API包含很多可以用不同行为进行参数化的方法,包括排序、线程和GUI处理。