11.1 观察者模式(Observer) :自定义主题
I.定义了对象1:N的依赖关系,这样当一个对象的主题发生变化时,所有依赖于这个对象的相关对象都会被更新;
II.被观察的对象叫做Subject(主题)
III.实现方式有push和pull(push可能导致接口不能重用,pull是观察者主动查询信息,导致信息不及时)
使用接口定义的主题
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
/**
* 观察者 观察的对象是T
*
* @param <T>
*/
interface IObserver<T> {
void update(T t);
}
/**
* 观察的主题,
* 提供对观察者S的操作 - add remove
*/
interface ISubject<S> {
void addObserver(S s);
void removeObserver(S s);
void notifyObservers();//提醒观察者
}
@Slf4j
class ObserverIpml implements IObserver<String> {
@Override
public void update(String s) {
log.info("message:{}", s);
}
}
@Slf4j
class SubjectImpl implements ISubject<IObserver> {
private List<IObserver<String>> observers = new ArrayList<>();
@Override
public void addObserver(IObserver iObserver) {
this.observers.add(iObserver);
}
@Override
public void removeObserver(IObserver iObserver) {
this.observers.remove(iObserver);
}
@Override
public void notifyObservers() {
this.observers.forEach(vo -> {
vo.update("message");
});
}
}
public class ObserverModel {
@Test
public void test(){
IObserver observer = new ObserverIpml();
IObserver observer2 = new ObserverIpml();
ISubject iSubject = new SubjectImpl();
iSubject.addObserver(observer);
iSubject.addObserver(observer2);
iSubject.notifyObservers();
}
}