用Lambda重構責任模式鏈

banq發表於2019-01-27

責任鏈模式是建立處理物件鏈(例如一系列操作)的通用解決方案。一個處理物件可以做一些工作並將結果傳遞給另一個物件,然後該物件也做一些工作並將其傳遞給另一個處理物件,依此類推。

責任鏈模式:不使用Lambda表示式
步驟1:通常,透過定義表示處理物件的抽象類來實現該模式,該處理物件定義用於跟蹤後繼的欄位。一旦完成工作,  處理物件將其工作交給其繼任者。在程式碼中它看起來像這樣:

public abstract class ProcessingObject<T> {
 protected ProcessingObject<T> successor;

 public void setSuccessor(ProcessingObject<T> successor) {
  this.successor = successor;
 }

 public T handle(T input) {
  T r = handleWork(input);
  if (successor != null) {
   return successor.handle(r);
  }
  return r;
 }

 abstract protected T handleWork(T input);
}


方法handle提供瞭如何處理一項工作的概述。透過繼承類ProcessingObject併為方法handleWork提供實現,可以建立不同型別的處理物件  。
讓我們看一個如何使用這種模式的例子。您可以建立兩個處理物件進行一些文字處理:

public class HeaderTextProcessing
  extends ProcessingObject<String> {
 public String handleWork(String text) {
  return "From Raoul, Mario and Alan: " + text;
 }
}

public class SpellCheckerProcessing
  extends ProcessingObject<String> {
 public String handleWork(String text) {
  return text.replaceAll("labda", "lambda");
 }
}

讓我們編寫程式碼來測試上面沒有lambda表示式的程式碼:

public static void main(String[] args) {
 ProcessingObject<String> p1 = new HeaderTextProcessing();
 ProcessingObject<String> p2 = new SpellCheckerProcessing();
 p1.setSuccessor(p2);
 String result1 = p1.handle("Aren't labdas really sexy?!!");
 System.out.println(result1);
}


責任鏈模式:使用Lambda表示式
透過使用lambda表示式,我們可以避免建立子類來實現handleWork()方法。我們可以將處理物件表示為Function <String,String> 的例項,   或者更確切地說是 UnaryOperator <String> 。要連結它們,我們只需要使用andThen  方法來組合這些函式  。

public static void main(String[] args) {

 // First processing object
 UnaryOperator<String> headerProcessing =
   (String text) -> "From Raoul, Mario and Alan: " + text;
   
 //Second processing object
 UnaryOperator<String> spellCheckerProcessing =
   (String text) -> text.replaceAll("labda", "lambda");
   
 // Compose the two functions resulting in a chain of operations.
 Function<String, String> pipeline = headerProcessing.andThen(spellCheckerProcessing);
 String result2 = pipeline.apply("Aren't labdas really sexy?!!");
 System.out.println(result2);
}




 

相關文章