设为首页 加入收藏

TOP

Java设计模式之---观察者模式
2014-11-23 19:05:58 来源: 作者: 【 】 浏览:31
Tags:Java 设计模式 --- 观察者 模式

Java观察者模式,或叫做观测者模式,说白了,就是对象间的一对多依赖,当一个对象的状态发生改变时,它的所有依赖者都会收到通知并自动更新。


那么我们可以定义以下三个接口:


主题接口,也就是被观察的主题对象:


package observer;


public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}


观察者接口,当观察者发现主题对象状态改变时,要进行自身的更新:


package observer;


public interface Observer {
public void update(double value);
}


显示接口,被观察的主题数据需要通过某种方式显示出来:


package observer;


public interface Display {
public void display();
}


为方便起见,我们举例来讲解。假设现在我们要观察股市行情,那么对于股市来说,所有股民的电脑或者股市行情的布告板就是它的观察者,而股市本身就是一个被观察的主题对象。


那么我们可以很清楚的有下面几个类的定义:


股市行情类,也就是此时真正被观察的主题对象:


package observer;
import java.util.ArrayList;
public class StockQuotation implements Subject{


private ArrayList observers;
private double stockvalue;

public StockQuotation(){
observers=new ArrayList();
}

public void registerObserver(Observer o) {
observers.add(o);
}

public void removeObserver(Observer o) {
int i=observers.indexOf(o);
if(i>=0){
observers.remove(i);
}
}


public void notifyObservers() {
for(int i=0;i Observer observer=(Observer) observers.get(i);
observer.update(stockvalue);
}
}

public void valueChanged(){
notifyObservers();
}

public void setValue(double stockvalue){
this.stockvalue=stockvalue;
valueChanged();
}
}


布告板类,用于显示股市:


package observer;


public class BillBoard implements Observer, Display{


private double stockvalue;
private Subject stockQuotation;

public BillBoard(Subject stockQuotation){
this.stockQuotation=stockQuotation;
stockQuotation.registerObserver(this);
}

public void display() {
System.out.println("Current stock quotation: "+stockvalue);
}


public void update(double stockvalue) {
this.stockvalue=stockvalue;
display();
}

public void deleteThisDisplay(){
this.stockQuotation.removeObserver(this);
}
}


最后就是主类:


package observer;


public class Main {
public static void main(String[] args){
StockQuotation stockQuotation = new StockQuotation();
BillBoard billBoard = new BillBoard(stockQuotation);
stockQuotation.setValue(2099.9);
billBoard.deleteThisDisplay();
stockQuotation.setValue(2090.9);
}
}


我们发现主类调用


billBoard.deleteThisDisplay();


之后布告板billBoard便不再是观察者,所有它接收不到任何的股市行情了。


这样的简单代码就实现了观察者模式。


我们可以发现,当新类型的观察者出现时,主题的代码不需要修改。主题不在乎别的,只会发送通知给所有实现了观察者接口的对象。


主题和观察者之间松耦合,正是观察者模式的独到之处。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java设计模式之---装饰者模式 下一篇2015-8-29阿里校园招聘研发工程师..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: