Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 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<Observer> observers;
 private double stockvalue;
 
 public StockQuotation(){
  observers=new ArrayList<Observer>();
 }
 
 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<observers.size();++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便不再是观察者,所有它接收不到任何的股市行情了。这样的简单代码就实现了观察者模式。我们可以发现,当新类型的观察者出现时,主题的代码不需要修改。主题不在乎别的,只会发送通知给所有实现了观察者接口的对象。主题和观察者之间松耦合,正是观察者模式的独到之处。大话设计模式(带目录完整版) PDF+源代码 http://www.linuxidc.com/Linux/2014-08/105152.htmJava中介者设计模式 http://www.linuxidc.com/Linux/2014-07/104319.htmJava 设计模式之模板方法开发中应用 http://www.linuxidc.com/Linux/2014-07/104318.htm设计模式之 Java 中的单例模式(Singleton) http://www.linuxidc.com/Linux/2014-06/103542.htm跟JBPM学习设计模式 http://www.linuxidc.com/Linux/2014-06/102861.htm本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-10/108751.htm