观察者模式
定义: 一个对象状态的改变,可以通知到过个对象
类型: 行为类模式
类图:
观察者对象结构:
-
Subject(被观察者)-被观察者定义了观察者集合,行为包括往集合中添加观察者、删除观察者、更新集合观察者
-
ConcreteSubject(被观察者子类)-继承被观察者,实现业务逻辑
-
Observer(观察者)-是一个interface,用来提供统一的update方法,实现被观察者与观察者之间的解耦
-
ConcreteObserver(观察者的子类) - 实现了观察者接口,具体实现了update方法的业务逻辑
/**
*
* 目标对象
**/
public abstract class Subject {
protected Vector<Observer> observers = new Vector<>();
public void attach(Observer observer){
observers.add(observer);
}
public void detach(Observer observer){
if(observers.contains(observer)){
observers.remove(observer);
}
}
protected void notifyObservers(){
for (Observer observer:observers ) {
observer.update();
}
}
public abstract void excute();
}
//被观察者子类
class ConcreteSubject extends Subject {
@Override
public void excute() {
System.out.println("被观察者事件反生");
this.notifyObservers();
}
public static void main(String[] args){
Subject sub = new ConcreteSubject();
sub.attach(new ConcreteObserver());
sub.attach(new ConcreteObserver());
sub.excute();
}
}
//观察者接口
interface Observer {
void update();
}
//观察者实现类
class ConcreteObserver implements Observer {
@Override
public void update() {
System.out.println("通知 ConcreteObserver 对象 更新");
}
}
注意事项:
- 当观察者较多时,会使集合类对象较多,性能存在影响
- java语言中,有一个接口Observer,以及它的实现类Observable,对观察者角色常进行了实现
参考:w3c