引用书中原话及代码:
观察者模式是另一种可被Lambda 表达式简化和改进的行为模式。在观察者模式中,被观察者持有一个观察者列表。当被观察者的状态发生改变,会通知观察者
传统的代码需要一层模板类,lambda表达式简化了模式,不需要去模板类
话不多说,show code
interface LandingObserver {
public void observeLanding(String name);
}
class Moon {
private final List<LandingObserver> observers = new ArrayList<>();
public void ****land****(String name) {
for (LandingObserver observer : observers) {
observer.observeLanding(name);
}
}
public void startSpying(LandingObserver observer) {
observers.add(observer);
}
}
//传统模式需要本模板类,使用lambda表达式,本类不需要
public class Nasa implements LandingObserver {
@Override
public void observeLanding(String name) {
if (name.contains("Apollo")) {
System.out.println("We made it!");
}
}
}
Moon moon = new Moon();
//日常操作(传统需要定义Nasa方法)
moon.startSpying(new Nasa());
//Lambda神操作
//这样就可以省略模板类Nasa
moon.startSpying(name -> {name.contains("Apollo");System.out.println("We made it");});
moon.land("Apollo 11");
测试结果:We made it!
We made it
一些理解:
- 使用moon.startSpying(表达式),前提是接口满足Java8的函数接口条件
- 例中唯一的表达式是实现接口方法的过程,然后在land中调用已实现的接口方法
- 其实重点是自己对1,2的理解,之前对调用未实现的接口有一点疑惑,实则在调用前已经实现了。