一、观察者模式定义
- 对象之间的一对多依赖
- 当一个对象改变状态时,所有依赖者都会收到通知并更新
- 可参考:报纸订阅服务,出版者和订阅者之间即为观察者模式
二、实现
- 所有对象都要实现一个update()方法
三、松耦合的优点
- 主题唯一依赖的是一个实现Observer接口的对象列表,所以可以随时增加删除观察者,主题不受影响
- 可以独立地复用主题或观察者,系统更具有弹性
/**
* @name: Sbuject.class
* @Author :
* @create :
* @Desc: 被观察者,有更新自动发送通知
*/
public class Sbuject {
private List<Observer> observers = new ArrayList<Observer>();
private int state; //状态
public int getState(){
return state;
}
public void setState(int state){
this.state = state;
notifyAllObservers();
}
//添加观察
public void attach(Observer observer){
observers.add(observer);
}
//移除观察
public void remove(){
observers.remove(observers.size()-1);
}
public void notifyAllObservers(){
for(Observer observer:observers){
observer.update();
}
}
}
/**
* @name: Observer.class
* @Author : cicada
* @create :
* @Desc: 观察者
*/
public abstract class Observer {
protected Sbuject subject;
public abstract void update();
}
public class TrueObserver extends Observer {
public TrueObserver(Sbuject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("-----观察者1号就位"+this.subject.getState());
}
}
public class Test {
public static void main(String[] args) {
Sbuject sbuject = new Sbuject();
new TrueObserver(sbuject);
sbuject.setState(18);
}
}