您的位置:首页 > 运维架构 > Tomcat

观察者设计模式

2016-04-08 02:57 435 查看
Java设计模式横向分为三种:创建型,结构性,行为型。纵向又可以分为两种:类模式与对象模式。




现在介绍其中一种,观察者设计模式。
所谓观察者通俗来说就是:很多Observer类观察一个Observable类。(很多观察者观察一个东西),最典型的例子就是全球投资者观察股市波动时侯,只要股价发生变化,那么投资者一定是同时观察到股价变化。并接受这条信息。
那么股价作为被观察的对象的属性,一定是在被观察者对象中产生,改变的方法也在被观察者中产生,通过股价改变,从而使得所有观察者接受到信号,而这个信号触发所导致的结果的方法一定在观察者中产生。




在jdk中java.util.* 已经提供了Observable和Observer去实现观察者模式。下面通过代码来理解。

产生随机价格的工具类:
package myjava.jdk;
import java.util.Random;
public class RandomUtil {
public static float[] getRandomFloatArray(int randomCnt) {
Random r = new Random();
float[] sort = new float[randomCnt];
for (int i = 0; i < randomCnt; i++) {
sort[i] = r.nextFloat();
}
return sort;
}
}
观察者模式:
package myjava.jdk;
import java.util.* ;
class Stock extends Observable{
private float price ;// 股价
public Stock(float price){
this.price = price ;
}
public float getPrice(){
return this.price ;
}
public void setPrice(float price){
// 每一次修改的时候都应该引起观察者的注意
super.setChanged() ;          // 设置变化点
super.notifyObservers(price) ;// 价格被改变
this.price = price ;
}
public String toString(){
return "股价价格为:" + this.price ;
}
};
class StockPriceObserver implements Observer{
private String name ;
public StockPriceObserver(String name){    // 设置每一个投资者的名字
this.name = name ;
}
public void update(Observable o,Object arg){
if(arg instanceof Float){
System.out.print(this.name + "观察到股价更改为:") ;
System.out.println(((Float)arg).floatValue()) ;
}
}
};
public class ObserStockChange{
public static void main(String args[]) throws Exception{
Stock h = new Stock(1000000) ;
//输出顺序与加入顺序相反
StockPriceObserver hpo1 = new StockPriceObserver("高盛集团") ;
StockPriceObserver hpo2 = new StockPriceObserver("Morgan Stanley") ;
StockPriceObserver hpo3 = new StockPriceObserver("Warren Buffett") ;
StockPriceObserver hpo4 = new StockPriceObserver("中信证券") ;
h.addObserver(hpo1) ;
h.addObserver(hpo2) ;
h.addObserver(hpo3) ;
h.addObserver(hpo4) ;
System.out.println(h) ;
//设置十个变化的价格,每隔3秒钟更新一次
float[] sort = RandomUtil.getRandomFloatArray(10);
for(int i=0; i<sort.length; i++){
float price = sort[i];
h.setPrice(price*1000);
System.out.println(h) ;
System.out.println("第"+(i+1)+"次股价变化"+"--------------------");
Thread.sleep(3000);
}
}
};
程序运行结果:




在Tomcat整个启动时候,用到了观察者设计模式。在Lifecycle,Servlet实例创建,Session管理,Container管理大量用到此模式。因为容器状态改变后,tomcat里面组件也会相应的发生变化。可谓牵一发而动全身。



还有request请求到达tomcat时候,就知道要访问那个子容器了,为什么?因为MappingListner保留了所有容器的信息,只要容器改变就会通知到它。这也是观察者模式的一个应用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息