Lambda重构面向对象的设计模式

策略模式

Lambda表达式避免了采用策略设计模式时僵化的模板代码。

1
2
3
4
5
6
Validator numericValidator = 
new Validator((String s) -> s.matches("[a-z]+"));
boolean b1 = numericValidator.validate("aaaa");
Validator lowerCaseValidator =
new Validator((String s) -> s.matches("\\d+"));
boolean b2 = lowerCaseValidator.validate("bbbb");

模板方法

通过传递Lambda表达式,直接插入不同的行为,不再需要继承。

1
2
3
4
5
6
public void processCustomer(int id, Consumer<Customer> makeCustomerHappy){ 
Customer c = Database.getCustomerWithId(id);
makeCustomerHappy.accept(c);
}
new OnlineBankingLambda().processCustomer(1337, (Customer c) ->
System.out.println("Hello " + c.getName());

观察者模式

无需显式地实例化观察者对象,直接传递Lambda表达式表示需要执行的行为即可。

1
2
3
4
5
6
7
8
9
10
f.registerObserver((String tweet) -> { 
if(tweet != null && tweet.contains("money")){
System.out.println("Breaking news in NY! " + tweet);
}
});
f.registerObserver((String tweet) -> {
if(tweet != null && tweet.contains("queen")){
System.out.println("Yet another news in London... " + tweet);
}
});

责任链模式

将处理对象作为函数的一个实例,或者更确切地说作为UnaryOperator-

的一个实例。为了链接这些函数,你需要使用andThen方法对其进行构造。

1
2
3
4
5
6
7
UnaryOperator<String> headerProcessing = 
(String text) -> "From Raoul, Mario and Alan: " + text;
UnaryOperator<String> spellCheckerProcessing =
(String text) -> text.replaceAll("labda", "lambda");
Function<String, String> pipeline =
headerProcessing.andThen(spellCheckerProcessing);
String result = pipeline.apply("Aren't labdas really sexy?!!")

工厂模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Supplier<Product> loanSupplier = Loan::new; 
Loan loan = loanSupplier.get();

final static Map<String, Supplier<Product>> map = new HashMap<>();
static {
map.put("loan", Loan::new);
map.put("stock", Stock::new);
map.put("bond", Bond::new);
}

public static Product createProduct(String name){
Supplier<Product> p = map.get(name);
if(p != null) return p.get();
throw new IllegalArgumentException("No such product " + name);
}

假设你希望保存具有三个参数(两个参数为Integer类型,一个参数为String
类型)的构造函数;为了完成这个任务,你需要创建一个特殊的函数接口TriFunction。

1
2
3
4
5
public interface TriFunction<T, U, V, R>{ 
R apply(T t, U u, V v);
}
Map<String, TriFunction<Integer, Integer, String, Product>> map
= new HashMap<>();

匿名类

1
2
3
4
5
Runnable r2 = () -> System.out.println("Hello");

doSomething(() -> System.out.println("Danger danger!!"));

doSomething((Task)() -> System.out.println("Danger danger!!"));

有条件的延迟执行

1
2
3
4
5
6
7
logger.log(Level.FINER, () -> "Problem: " + generateDiagnostic());

public void log(Level level, Supplier<String> msgSupplier){
if(logger.isLoggable(level)){
log(level, msgSupplier.get());
}
}
------ 本文结束------

本文标题:Lambda重构面向对象的设计模式

文章作者:Perkins

发布时间:2020年10月09日

原始链接:https://perkins4j2.github.io/posts/2762600/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。