观察者模式:观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
package com.cjian.GOF;
import java.util.ArrayList;
import java.util.List;
/**
* @description: 观察者模式
* @author: CJ
* @time: 2020/12/16 15:16
*/
public class ObserverDemo {
public static void main(String[] args) {
Subjecter subjecter = new Subjecter();
Observer1 o1 = new Observer1();
Observer2 o2 = new Observer2();
//添加观察者
subjecter.addObserver(o1);
subjecter.addObserver(o2);
//通知观察者
subjecter.notifyObserver("我发布了一个消息");
//移除一个观察者
subjecter.removeObserver(o1);
//再次通知观察者
subjecter.notifyObserver("我又发布了一个消息");
}
}
//主题
interface Subject {
void addObserver(Observer observer);
void notifyObserver(String msg);
void removeObserver(Observer observer);
}
//主题的实现
class Subjecter implements Subject {
private static List<Observer> observerlist = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
observerlist.add(observer);
}
@Override
public void notifyObserver(String msg) {
for (Observer ob : observerlist) {
ob.doSomeThing(msg);
}
}
@Override
public void removeObserver(Observer observer) {
observerlist.remove(observer);
}
}
//订阅者
interface Observer {
void doSomeThing(String msg);
}
//订阅者的实现
class Observer1 implements Observer {
@Override
public void doSomeThing(String msg) {
System.out.println("观察者1接到了通知:"+msg);
}
}
class Observer2 implements Observer {
@Override
public void doSomeThing(String msg) {
System.out.println("观察者2接到了消息:"+msg);
}
}
输出:
jdk中的Observable(主题)、Observer(观察者)类以及Spring的时间驱动ApplicationListener都采用了观察者模式