偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java中觀察者模式的使用

開發(fā) 后端
在一對(duì)多依賴的對(duì)象關(guān)系中, 如果這個(gè)'一'對(duì)象狀態(tài)發(fā)生了變化,那么它所有依賴的'多'對(duì)象都應(yīng)該被通知,然后做相應(yīng)的變化,這就是觀察者模式. 就如同'多'對(duì)象一直在觀察'一'對(duì)象的狀態(tài)變化一樣.

在一對(duì)多依賴的對(duì)象關(guān)系中, 如果這個(gè)'一'對(duì)象狀態(tài)發(fā)生了變化,那么它所有依賴的'多'對(duì)象都應(yīng)該被通知,然后做相應(yīng)的變化,這就是觀察者模式. 就如同'多'對(duì)象一直在觀察'一'對(duì)象的狀態(tài)變化一樣.

在觀察者模式中最重要的倆個(gè)對(duì)象分別是:Observable和Observer對(duì)象.它們的關(guān)系可總結(jié)如下:

1. Observable和Observer對(duì)象是一對(duì)多的關(guān)系,也就是說一旦Observable對(duì)象狀態(tài)變化,它就要負(fù)責(zé)通知所有和它有關(guān)系的Observer對(duì)象,然后做相應(yīng)的改變.

1. Observable對(duì)象不會(huì)主動(dòng)去通知各個(gè)具體的Observer對(duì)象其狀態(tài)發(fā)生了變化,而是提供一個(gè)注冊(cè)接口供Observer對(duì)象使用,任何一個(gè)Observer對(duì)象如果想要被通知,則可以使用這個(gè)接口來注冊(cè).

3. 在Observable中有一個(gè)集合和一個(gè)狀態(tài)控制開關(guān),所有注冊(cè)了通知的Observer對(duì)象會(huì)被保存在這個(gè)集合中.這個(gè)控制開關(guān)就是用來控制Observable是否發(fā)生了變化,一旦發(fā)生了變化,就通知所有的Observer對(duì)象更新狀態(tài).

在java api中分別提供了Observable對(duì)象:java.util.Observable和Observer接口:java.util.Observer. 下面用實(shí)例來實(shí)現(xiàn)一下觀察者模式: 股票系統(tǒng)

所有的類如下:

StockData (Observable對(duì)象,也就是所股票數(shù)據(jù)發(fā)生了變化,它就要通知所有和它有關(guān)系的交易實(shí)體做相應(yīng)的變化)

BigBuyer (Observer對(duì)象, 實(shí)現(xiàn)了Observer接口)

TradingFool (Observer對(duì)象, 實(shí)現(xiàn)了Observer接口)

StockQuote 測(cè)試類

在這個(gè)例子中一旦StockData對(duì)象的狀態(tài)發(fā)生了變化,那BigBuyer和TradingFool都應(yīng)該受到通知:

StockData.java:

Java代碼

  1. import java.util.Observable;     
  2.     
  3. public class StockData extends Observable     
  4.     {     
  5.     private String symbol;     
  6.     private float close;     
  7.     private float high;     
  8.     private float low;     
  9.     private long volume;     
  10.     
  11.     public StockData()     
  12.         {}     
  13.     
  14.     public String getSymbol()     
  15.         {     
  16.         return symbol;     
  17.         }     
  18.     
  19.     public float getClose()     
  20.         {     
  21.         return close;     
  22.         }     
  23.     
  24.     public float getHigh()     
  25.         {     
  26.         return high;     
  27.         }     
  28.     
  29.     public float getLow()     
  30.         {     
  31.         return low;     
  32.         }     
  33.     
  34.     public long getVolume()     
  35.         {     
  36.         return volume;     
  37.         }     
  38.     
  39.     public void sendStockData()     
  40.         {     
  41.         setChanged();     
  42.         notifyObservers();     
  43.         }     
  44.     
  45.     public void setStockData(String symbol,float close,float high,float low,long volume)     
  46.         {     
  47.         this.symbol = symbol;     
  48.         this.close = close;     
  49.         this.high = high;     
  50.         this.low = low;     
  51.         this.volume = volume;     
  52.         sendStockData();     
  53.         }     
  54.     }    

 

BigBuyer.java:

Java代碼

  1. public class BigBuyer implements Observer     
  2.     {     
  3.     private String symbol;     
  4.     private float close;     
  5.     private float high;     
  6.     private float low;     
  7.     private long volume;     
  8.     
  9.     public BigBuyer(Observable observable)     
  10.         {     
  11.         observable.addObserver(this); //注冊(cè)關(guān)系     
  12.         }     
  13.     
  14.     public void update(Observable observable,Object args)     
  15.         {     
  16.         if(observable instanceof StockData)     
  17.             {     
  18.             StockData stockData = (StockData)observable;     
  19.             this.symbol = stockData.getSymbol();     
  20.             this.close = stockData.getClose();     
  21.             this.high = stockData.getHigh();     
  22.             this.low = stockData.getLow();     
  23.             this.volume = stockData.getVolume();     
  24.             display();     
  25.             }     
  26.         }     
  27.     
  28.     public void display()     
  29.         {     
  30.         DecimalFormatSymbols dfs = new DecimalFormatSymbols();     
  31.         DecimalFormat volumeFormat = new DecimalFormat("###,###,###,###",dfs);     
  32.         DecimalFormat priceFormat = new DecimalFormat("###.00",dfs);     
  33.         System.out.println("Big Buyer reports... ");     
  34.         System.out.println("\tThe lastest stock quote for " + symbol + " is:");     
  35.         System.out.println("\t$" + priceFormat.format(close) + " per share (close).");     
  36.         System.out.println("\t$" + priceFormat.format(high) + " per share (high).");     
  37.         System.out.println("\t$" + priceFormat.format(low) + " per share (low).");     
  38.         System.out.println("\t" + volumeFormat.format(volume) + " shares traded.");     
  39.         System.out.println();     
  40.         }     
  41.     }    

 

TradingFool.java:

Java代碼

  1. public class TradingFool implements Observer     
  2.     {     
  3.     private String symbol;     
  4.     private float close;     
  5.     
  6.     public TradingFool(Observable observable)     
  7.         {     
  8.         observable.addObserver(this);//注冊(cè)關(guān)系     
  9.         }     
  10.     
  11.     public void update(Observable observable,Object args)     
  12.         {     
  13.         if(observable instanceof StockData)     
  14.             {     
  15.             StockData stockData = (StockData)observable;     
  16.             this.symbol = stockData.getSymbol();     
  17.             this.close = stockData.getClose();     
  18.             display();     
  19.             }     
  20.         }     
  21.     
  22.     public void display()     
  23.         {     
  24.         DecimalFormatSymbols dfs = new DecimalFormatSymbols();     
  25.         DecimalFormat priceFormat = new DecimalFormat("###.00",dfs);     
  26.         System.out.println("Trading Fool says... ");     
  27.         System.out.println("\t" + symbol + " is currently trading at $" + priceFormat.format(close) + " per share.");     
  28.         System.out.println();     
  29.         }     
  30.     }    

 

StokeQuote.java

Java代碼

 

  1. public class StockQuotes     
  2.     {     
  3.     public static void main(String[] args)     
  4.         {     
  5.         System.out.println();     
  6.         System.out.println("-- Stock Quote Application --");     
  7.         System.out.println();     
  8.     
  9.         StockData stockData = new StockData();     
  10.     
  11.         // register observers...     
  12.         new TradingFool(stockData);     
  13.         new BigBuyer(stockData);     
  14.     
  15.         // generate changes to stock data...     
  16.         stockData.setStockData("JUPM",16.10f,16.15f,15.34f,(long)481172);     
  17.         stockData.setStockData("SUNW",4.84f,4.90f,4.79f,(long)68870233);     
  18.         stockData.setStockData("MSFT",23.17f,23.37f,23.05f,(long)75091400);     
  19.         }     
  20.     }   

在測(cè)試類中我們可以看到倆個(gè)Observer對(duì)象都注冊(cè)了Observable對(duì)象,而當(dāng)Observable對(duì)象發(fā)生改變時(shí),這倆個(gè)Observable對(duì)象就會(huì)做相應(yīng)的更新了, 運(yùn)行結(jié)果如下:

Java代碼

  1. Big Buyer reports...      
  2.     The lastest stock quote for JUPM is:     
  3.     $16.10 per share (close).     
  4.     $16.15 per share (high).     
  5.     $15.34 per share (low).     
  6.     481,172 shares traded.     
  7.     
  8. Trading Fool says...      
  9.     JUPM is currently trading at $16.10 per share.     
  10.     
  11. Big Buyer reports...      
  12.     The lastest stock quote for SUNW is:     
  13.     $4.84 per share (close).     
  14.     $4.90 per share (high).     
  15.     $4.79 per share (low).     
  16.     68,870,233 shares traded.     
  17.     
  18. Trading Fool says...      
  19.     SUNW is currently trading at $4.84 per share.     
  20.     
  21. Big Buyer reports...      
  22.     The lastest stock quote for MSFT is:     
  23.     $23.17 per share (close).     
  24.     $23.37 per share (high).     
  25.     $23.05 per share (low).     
  26.     75,091,400 shares traded.     
  27.     
  28. Trading Fool says...      
  29.     MSFT is currently trading at $23.17 per share.    

 

我們通過Observable源碼可以看到,其實(shí)Observable對(duì)象不關(guān)心具體的Observer的實(shí)例類型. 只要是實(shí)現(xiàn)了Observer接口的Observer對(duì)象都可以得到通知,這就為我們?nèi)绻胍獙?duì)模型進(jìn)行擴(kuò)展提供了方便,使Observable對(duì)象和Observer對(duì)象實(shí)現(xiàn)了松耦合. 如果我們需要添加一個(gè)新的Observer對(duì)象時(shí),我們只要注冊(cè)一下,當(dāng)Observable對(duì)象發(fā)生變化時(shí)就可以得到通知,而不要做其他任何改變,非常方便.

【編輯推薦】

  1. 軟件項(xiàng)目管理總體流程設(shè)計(jì)
  2. 項(xiàng)目組合管理中的十大最佳實(shí)踐
  3. 應(yīng)用軟件項(xiàng)目的配置管理實(shí)例
責(zé)任編輯:金賀 來源: ITEYE博客
相關(guān)推薦

2020-10-26 08:45:39

觀察者模式

2021-09-06 10:04:47

觀察者模式應(yīng)用

2022-01-29 22:12:35

前端模式觀察者

2013-11-26 17:09:57

Android設(shè)計(jì)模式

2021-07-08 11:28:43

觀察者模式設(shè)計(jì)

2024-12-03 09:34:35

觀察者模 式編程Javav

2012-08-27 10:52:20

.NET架構(gòu)觀察者模式

2021-03-29 07:14:28

Spring觀察者模式

2024-02-18 12:36:09

2015-11-25 11:10:45

Javascript設(shè)計(jì)觀察

2009-03-30 09:39:04

觀察者思想換位設(shè)計(jì)模式

2024-06-04 13:11:52

Python行為設(shè)計(jì)模式開發(fā)

2021-01-25 05:38:04

設(shè)計(jì)原理VueSubject

2021-09-29 19:45:24

觀察者模式Observable

2021-06-03 12:26:28

觀察者模式面試阿里P6

2022-05-09 10:50:13

觀察者模式設(shè)計(jì)模式

2022-07-13 08:36:57

MQ架構(gòu)設(shè)計(jì)模式

2021-04-14 14:40:37

forSpringJava

2021-06-07 20:03:04

監(jiān)聽器模式觀察者

2021-11-08 11:32:01

觀察
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)