前言
Observable设计模式存在于许多Java API和响应式编程中。下面介绍Java中永恒的Observable模式。
-
Observable设计模式用于许多重要的Java API。一个众所周知的示例是使用ActionListenerAPI执行操作的JButton。在这个例子中,我们ActionListener在按钮上进行了监听或观察。单击按钮时,ActionListener将执行操作。
-
Observable模式也用于响应式编程。在反应式应用程序中使用观察者是有道理的,因为反应式的本质是反应:当另一个进程发生时,事情就会发生。
-
Observable是一种行为设计模式。它的功能是在事件发生时执行一个动作。两个常见的例子是按钮点击和通知,但这种模式还有更多用途。
例子
在Observable设计模式中,一个对象在执行操作时会通知另一个对象。为了理解该模式的价值,让我们想象一个需要单击按钮并且没有通知另一个对象的场景,如图1所示,ActionCheck 每秒检查一次按钮:
请注意,ActionCheck必须每秒检查一次按钮。现在,想象一下,如果我们每秒对该按钮进行多次操作检查。您能想象这会对您的应用程序性能产生什么影响吗?
让Do Something按钮通知ActionCheck.这样,ActionCheck逻辑就不需要每秒轮询Do Something按钮。
Observable设计模式的元素
在下图中,请注意观察者模式的基础是 Observer 接口(即观察的对象)和 Subject(被观察的对象)。类Newsletter implements Subject 和 Subscriber implements Observer。最后,SendEmailMain 是我们的主线程,它来触发变化。如图2所示
代码
Subject
被观察者的行为会被监听,特殊行为会触发事件
public interface Subject {
void addSubscriber(Observer observer);
void removeSubscriber(Observer observer);
void notifySubscribers();
}
Observer
观察者监听到 Subject 的特殊行为,会做对应的逻辑处理
public interface Observer {
public void update(String email);
}
Newsletter(发布者)
Newsletter 是 Subject 的实现类,它会存储 Observer,当特殊行为发生时会通知 Observer
import java.util.ArrayList;
import java.util.List;
public class Newsletter implements Subject {
protected List<Observer> observers = new ArrayList<>();
protected String name;
protected String newEmail;
public Newsletter(String name) {
this.name = name;
}
public void addNewEmail(String newEmail) {
this.newEmail = newEmail;
// 添加了新的邮件联系人就要通知观察者
notifySubscribers();
}
@Override
public void addSubscriber(Observer observer) {
observers.add(observer);
}
@Override
public void removeSubscriber(Observer observer) {
observers.remove(observer);
}
@Override
public void notifySubscribers() {
observers.forEach(observer -> observer.update(newEmail));
}
}
Subscriber(订阅者)
此类实现了Observer接口
class Subscriber implements Observer {
private String name;
public Subscriber(String name) {
this.name = name;
}
@Override
public void update(String newEmail) {
System.out.println("Email for: " + name + " | Content:" + newEmail);
}
}
SendEmailMain(测试用例)
public class SendEmailMain {
public static void main(String[] args) {
Newsletter newsLetter = new Newsletter("Java Challengers");
Observer duke = new Subscriber("Duke");
Observer juggy = new Subscriber("Juggy");
Observer dock = new Subscriber("Moby Dock");
newsLetter.addSubscriber(duke);
newsLetter.addNewEmail("Lambda Java Challenge");
newsLetter.removeSubscriber(duke);
newsLetter.addSubscriber(juggy);
newsLetter.addSubscriber(dock);
newsLetter.addNewEmail("Virtual Threads Java Challenge");
}
}
输出如下
转载:https://www.jianshu.com/p/77ed2c481fde