如何使用Lambda表达式实现观察者模式?代码举例讲解

观察者模式定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生变化时,所有依赖于它的观察者对象都会得到通知并被自动更新。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 表达式的可读性就较低,这时应选择其他方式实现观察者模式。