观察者模式定义了对象之间的一对多关系,一个Observable(被观察者)和多个(观察者);
(Observable)主题(也就是可观察者)用一 个共同的接口来更新观察者
观察者和可观察者之间用松 耦合方式结合(loosecoupling),可观察者不知道观察 者的细节,只知道观察者实现 了观察者接口。
使用此模式时,你可从被观察 者处推(push)或拉(pull) 数据(然而,推的方式被认为 更“正确”)
有多个观察者时,不可以依赖 特定的通知次序
Swing大量使用观察者模式,许多GUI框架也是如此。(java的Swing中,addActionListenner就是一种观察者模式实现)。
此模式也被应用在许多地方, 例如:JavaBeans、RMI。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
下面这个是主题,也就是被观察者,只要它改变就会通知观察者它变了。
import java.util.Observable;
public class QuestionObservable extends Observable {
private boolean isHaveQuest;
public void haveQuestion() {
setChanged();
notifyObservers();
}
public void setQuestion(boolean arg) {
isHaveQuest = arg;
if (isHaveQuest)
haveQuestion();
}
}
-----------------------------------------------------------------------------
下面是观察者:恶魔.java ,当我有疑问了,恶魔就会回答我:
import java.util.Observable;
import java.util.Observer;
public class Devil implements Observer {
Observable ob;
public Devil(Observable o) {
ob = o;
ob.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if (o instanceof QuestionObservable) {
display();
}
}
private void display() {
// TODO Auto-generated method stub
System.out.println("Come on ,do it!");
}
}
--------------------------------------------------------------------------------------------------------------------
同样,我还有一个观察者:天使类.java,它也会在我有疑问回答我:
import java.util.Observable;
import java.util.Observer;
public class Angel implements Observer {
Observable o;
public Angel(Observable o) {
this.o = o;
o.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if (o instanceof QuestionObservable) {
display();
}
}
private void display() {
// TODO Auto-generated method stub
System.out.println("Do not do it,be nice ");
}
}
----------------------------
main.java---------》
public class Fascinate {
public static void main(String[] args) {
// TODO Auto-generated method stub
QuestionObservable ob = new QuestionObservable();
Angel angel = new Angel(ob);
Devil devil = new Devil(ob);
ob.setQuestion(true);
}
}