观察者模式定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生变化时,所有依赖于它的观察者对象都会得到通知并被自动更新。Lambda 表达式可以很好地实现观察者模式中观察者的定义。我们来看一个例子:
假设我们有一个消息中心,多个用户订阅感兴趣的消息。这是一个使用观察者模式的很好示例。
使用 Lambda 表达式实现观察者模式:
// 消息中心,消息主题
class MessageCenter {
// 存储观察者对象
private List<Observer> observers = new ArrayList<>();
// 增加观察者
public void addObserver(Observer observer) {
observers.add(observer);
}
// 移除观察者
public void removeObserver(Observer observer) {
observers.remove(observer);
}
// 通知所有观察者
public void notifyObservers(Message message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
// 消息接口
interface Message {
String getMessage();
}
// 具体的消息实现
class WarningMessage implements Message {
@Override
public String getMessage() {
return "这是一条警告消息!";
}
}
// 观察者接口
@FunctionalInterface
interface Observer {
void update(Message message);
}
//观察者对象
Observer user1 = (message) -> {
System.out.println(message.getMessage());
System.out.println("用户1接收到消息");
};
Observer user2 = (message) -> {
System.out.println(message.getMessage());
System.out.println("用户2接收到消息");
};
// 使用场景
MessageCenter center = new MessageCenter();
center.addObserver(user1);
center.addObserver(user2);
center.notifyObservers(new WarningMessage());
这里 MessageCenter 充当消息主题,user1 和 user2 是两个观察者,使用 Lambda 表达式实现。当 MessageCenter 发布消息时,两个观察者就可以收到通知和更新。
所以,这个示例演示了如何使用 Lambda 表达式实现观察者模式的观察者定义,使代码更加简洁。但是,如果观察者过于复杂,Lambda 表达式的可读性就较低,这时应选择其他方式实现观察者模式。