观察者模式
观察者模式描述:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
JDK自带观察者模式此处不做介绍, 相关链接:JDK自带观察者模式
码云地址地址:design_patterns
被观察者接口
代码片
.
public interface Subject {
//注册观察者
void register(Observer observer);
//移除观察者
void remove(Observer observer);
//通知被观察者
void notifyObserver(Object... objs);
}
被观察者实现类
代码片
.
public interface AnyService {
void any(Object... objs);
}
public class SubjectImpl implements Subject, AnyService {
//观察者集合
private final List<Observer> observers;
public SubjectImpl () {
observers = new ArrayList<>();
}
//通知所有观察者
@Override
public void any(Object... objs){
this.notifyObserver(objs);
}
@Override
public void register(Observer observer){
if(!observers.contains(observer)) {
observers.add(observer);
}
}
@Override
void remove(Observer observer){
observers.remove(observer);
}
@Override
void notifyObserver(Object... objs){
observers.stream()
.filter(Objects::nonNull)
.forEach(observer-> observer.update(this, objs));
}
}
定义观察者接口, 采用主动拉取模式获取数据
代码片
.
public interface Observer{
void update(Subject subject, Object... objs);
}
观察者抽象类实现类
代码片
.
public abstract class AbsObserver implements Observer{
//注册观察者
public AbsObserver (Subject subject) {
subject.register(this);
}
}
观察者实现类
代码片
.
public class ObserverImpl extends AbsObserver{
public ObserverImpl (Subject subject){
super(subject);
}
@Override
void update(Subject subject, Object... objs){
SubjectImpl SubjectImpl = (SubjectImpl)subject;
System.out.printf("观察者1"+ Arrays.toString(objs))
}
}
观察者实现类2
代码片
.
public class ObserverImpl2 extends AbsObserver{
public ObserverImpl2 (Subject subject){
super(subject);
}
@Override
void update(Subject subject, Object... objs){
SubjectImpl SubjectImpl = (SubjectImpl)subject;
System.out.printf("观察者2"+ Arrays.toString(objs))
}
}
执行代码
代码片
public class ObserverTest{
public static void main(String[] args) {
SubjectImpl subjectImpl = new SubjectImpl();
ObserverImpl observerImpl = new ObserverImpl (subjectImpl);
ObserverImpl2 observerImpl2 = new ObserverImpl2 (subjectImpl);
subjectImpl.any(args);
}
}
本文部分定义参考了网上博文和网上信息…