话不多说,直接上代码!
抽象被观察者:已注册的观察者的管理者
/**
* @description: 抽象被观察者,管理所有已注册的观察者,并且可以通过它来发布事件
* @author: 張青云
* @create: 2022-01-02 23:04
**/
public interface Subject {
/**
* 注册一个观察者
*/
void register(Observer observer);
/**
* 删除一个已注册的观察者
*/
void remove(Observer observer);
/**
* 发布一个事件
*/
void publish(Event event);
}
具体的被观察者
/**
* @description: 具体的被观察者
* @author: 張青云
* @create: 2022-01-02 23:20
**/
public class ObserverManager implements Subject {
private final HashSet<Observer> observers = new HashSet<>();
@Override
public void register(Observer observer) {
synchronized (this) {
observers.add(observer);
}
}
@Override
public void remove(Observer observer) {
synchronized (this) {
observers.remove(observer);
}
}
@Override
public void publish(Event event) {
for (Observer observer: observers) {
if(observer.care().contains(event)) {
observer.process();
}
}
}
}
抽象观察者
/**
* @description: 抽象观察者
* @author: 張青云
* @create: 2021-12-23 10:44
**/
public interface Observer {
/**
* 所要监听的事件
*/
Set<Event> care();
/**
* 当对应的事件发生时所要执行的操作
*/
void process();
}
事件
/**
* @description: 事件
* @author: 張青云
* @create: 2022-01-02 23:09
**/
public enum Event {
DataUpdate(),
Insert();
}
客户端:
public class ObserverMain {
public static void main(String[] args) {
String s = "hello";
Subject manager = new ObserverManager();
// 注册观察者(监听者)
manager.register(new Observer() {
@Override
public Set<Event> care() {
Set<Event> set = new HashSet<>(1);
set.add(Event.DataUpdate);
return set;
}
@Override
public void process() {
System.out.println("我已经知道数据被修改了!");
}
});
manager.register(new Observer() {
@Override
public Set<Event> care() {
Set<Event> set = new HashSet<>(1);
set.add(Event.DataUpdate);
return set;
}
@Override
public void process() {
System.out.println("我已经知道数据被修改了!");
}
});
s += " world!";
// 发布事件
manager.publish(Event.DataUpdate);
}
}
运行结果: