观察者模式

来源:互联网 发布:linux jdk1.7安装教程 编辑:程序博客网 时间:2024/05/18 03:25

观察者模式定义了对象之间的一对多关系,一个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);}@Overridepublic void update(Observable o, Object arg) {// TODO Auto-generated method stubif (o instanceof QuestionObservable) {display();}}private void display() {// TODO Auto-generated method stubSystem.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);}@Overridepublic void update(Observable o, Object arg) {// TODO Auto-generated method stubif (o instanceof QuestionObservable) {display();}}private void display() {// TODO Auto-generated method stubSystem.out.println("Do not do it,be nice ");}}

----------------------------
main.java---------》
public class Fascinate {public static void main(String[] args) {// TODO Auto-generated method stubQuestionObservable ob = new QuestionObservable();Angel angel = new Angel(ob);Devil devil = new Devil(ob);ob.setQuestion(true);}}


原创粉丝点击