Статьи

Шаблон стратегии в Java 8

Это два примера того, как реализовать дизайн шаблона стратегии с использованием функционального стиля Java 8 вместе с циклическим сопоставлением с шаблоном и библиотеками Hamcrest .

Метод PrintDependingOnInput — это стратегия, которая отправляет System.println некоторое сообщение на основе переданного журнала.

AddPrefix — это еще одна стратегия, которая добавляет префикс к сообщению на основе содержимого сообщения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.marco.patternmatching;
 
  
 
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.startsWith;
import static org.hamcrest.core.AllOf.allOf;
import java.util.ArrayList;
import java.util.List;
import com.aol.cyclops.matcher.builders.Matching;
 
  
 
public class FunctionalStrategy {
 
  public static void main(String[] args) {
     List<String> toTest = new ArrayList<>();
     toTest.add("INFO everything is fine");
     toTest.add("WARN something weird happened");
     toTest.add("ERROR NullPointerException");
     toTest.add("ERROR IOException");
      
     toTest.stream().forEach(FunctionalStrategy::printDependingOnInput);
 
     System.out.println("--------------------");
 
     List<String> messages = new ArrayList<>();
     messages.add("everything is fine");
     messages.add("something weird happened");
     messages.add("NullPointerException");
     messages.add("IOException");
 
     messages.stream().map(FunctionalStrategy::addPrefix).forEach(System.out::println);
  }
 
         
  public static void printDependingOnInput(String log) {
 
     Matching
        .when().isMatch(startsWith("INFO"))
                   .thenConsume(System.out::println)
        .when().isMatch(startsWith("WARN"))
                   .thenConsume(message -> System.out.println("Found one warning : " + message))
        .when().isMatch(allOf(startsWith("ERROR"), containsString("NullPointerException")))
                   .thenConsume(message -> System.err.println(message))
        .when().isMatch(allOf(startsWith("ERROR"), containsString("IOException")))
                   .thenConsume(message -> System.err.println(message + " Retrying a couple of times"))
        .match(log);
 
   }
 
   public static String addPrefix(String log) {
 
     return Matching
        .when().isMatch(allOf(not(containsString("Exception")), not(containsString("weird"))))
                    .thenApply(message -> "INFO " + message)
        .when().isMatch(containsString("weird"))
                    .thenApply(message -> "WARN " + message)
        .when().isMatch(containsString("Exception"))
                    .thenApply(message -> "ERROR " + message)
        .match(log).get();
 
  }
}

Красиво и чисто;)