观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。就好像这些观察者对象在时刻注视着目标对象(被观察)。无论何时该目标对象的状态发生变化,这些观察者对象都能够马上知道,并根据目标对象的新状态执行相应的任务。观察者模式又叫发布-订阅(Publish-Subscribe)模式。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
关键代码:在抽象类里有一个 ArrayList 存放观察者们。
优点:
1、观察者和被观察者是抽象耦合的。
2、建立一套触发机制。
3、符合“开闭原则”的要求
缺点:
1、当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率
2、目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用
代码实现
抽象观察者
interface Observer {
public void update();
}
抽象被观察者
abstract class Subject {
private Vector<Observer> obs = new Vector();
public void addObserver(Observer obs){
this.obs.add(obs);
}
public void delObserver(Observer obs){
this.obs.remove(obs);
}
protected void notifyObserver(){
for(Observer o: obs){
o.update();
}
}
public abstract void doSomething();
}
具体观察者
class ConcreteObserver1 implements Observer {
public void update() {
System.out.println("观察者1收到信息,并进行处理");
}
}
class ConcreteObserver2 implements Observer {
public void update() {
System.out.println("观察者2收到信息,并进行处理");
}
}
具体被观察者
class ConcreteSubject extends Subject {
public void doSomething(){
System.out.println("被观察者事件发生改变");
this.notifyObserver();
}
}
实现
public class Client {
public static void main(String[] args){
Subject sub = new ConcreteSubject();
sub.addObserver(new ConcreteObserver1()); //添加观察者1
sub.addObserver(new ConcreteObserver2()); //添加观察者2
sub.doSomething();
}
}