优点:
- 观察者和被观察者之间是抽象耦合
- 建立一套触发机制
缺点:
- 运行效率低
- 如果在观察者和观察目标之间存在循环依赖,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
- 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
角色:
- Subject被观察者
- Observer观察者
- ConceteSubject具体被观察者
- ConcreteObserver具体的观察者
Subject被观察者
package com.memory.observer;
import java.util.Vector;
/**
* 被观察者
*
* @author Administrator
*
*/
public abstract class Subject {
/**
* 存储集合 ,线程安全
*/
private Vector<Observer> obsVector = new Vector<>();
public void addObserVer(Observer o){
System.out.println("加入观察者列表");
this.obsVector.add(o);
}
public void delObserVer(Observer o){
System.out.println("移除观察者列表");
this.obsVector.remove(o);
}
public void notifyObservers(){
System.out.println("触发观察者模式");
for(Observer o:obsVector){
o.update();
}
}
}
ConceteSubject具体被观察者
package com.memory.observer;
/**
* 具体被观察者
*
* @author Administrator
*
*/
public class ConcreteSubject extends Subject{
/**
* 具体业务
*/
public void onWork(){
super.notifyObservers();
}
}
Observer观察者
package com.memory.observer;
/**
* 观察者
*
* @author Administrator
*
*/
public interface Observer {
/**
* 更新方法
*/
public void update();
}
ConcreteObserver具体的观察者
package com.memory.observer;
/**
* 具体观察者
*
* @author Administrator
*
*/
public class ConcreteObserver implements Observer {
/**
* 实现更新方法
*/
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("接收到消息,并处理");
}
}
测试
//创建一个被观察者
ConcreteSubject subject = new ConcreteSubject();
//定义一个观察者
Observer observer = new ConcreteObserver();
//观察者观察被观察者
subject.addObserVer(observer);
//观察者开始工作了
subject.onWork();
//输出结果
启动应用成功!开启美好的一天
加入观察者列表
触发观察者模式
接收到消息,并处理