java observer模式_Java观察者模式(Observer)详解及应用
Java觀察者模式(Observer)詳解及應用
(2011-12-15 14:03:30)
標簽:
雜談
Java觀察者模式(Observer)詳解及應用
由于網站帶有弱sns功能,因此需要設計關注和被關注的消息或是動作通知,那么將這個需求抽象出來的時候就會發現正好符合java中
訂閱者模式,我還是喜歡叫觀察著模式,具體網站的實現代碼就不寫了,寫一個簡單的例子大家了解下即可
一、概述
Java的設計模式很多,觀察者模式被稱為是模式中的皇后,而且Java
jdk也對它做了實現,可見該設計模式的重要位置。在圖形化設計的軟件中,為了實現視圖和事件處理的分離,大多都采用了Observer模式,比如Java的Swing,Flex的ActionScript等。在現實的應用系統中也有好多應用,比如像當當網、京東商城一類的電子商務網站,如果你對某件商品比較關注,可以放到收藏架,那么當該商品降價時,系統給您發送手機短信或郵件。這就是觀察者模式的一個典型應用,商品是被觀察者,有的叫主體;關注該商品的客戶就是觀察者。下面的一個事例將模擬這個應用。
GoF說道:Observer模式的意圖是“定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新”。從這段話里我們可以得到兩個信息,如下:
1, 觀察者(具體執行操作的對象,有多個)
2, 被觀察者(顧名思義是被觀察的對象,如果該對象發生某些變化則通知觀察者執行對應的操)
二、jdk中觀察者模式解析
在java的util包中實現了該設計模式的框架,大部分應用都可以直接用它,當然了你也可以自己實現它,實際上就是一個被觀察者的抽象類和一個觀察者接口。我們先看一下jdk是如何實現的。被觀察者的抽象類java.util.Observable
package java.util;
public class Observable {
private boolean changed = false;
private Vector obs;
//創建被觀察者時就創建一個它持有的觀察者列表,注意,這個列表是需要同步的。
public Observable() {
obs = new Vector();
}
public synchronized void addObserver(Observer o) {
if (o == null)
throw new NullPointerException();
if (!obs.contains(o)) {
obs.addElement(o);
}
}
public synchronized void deleteObserver(Observer o) {
obs.removeElement(o);
}
public void notifyObservers() {
notifyObservers(null);
}
public void notifyObservers(Object arg) {
Object[] arrLocal;
synchronized (this) {
if (!changed)
return;
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
public synchronized void deleteObservers() {
obs.removeAllElements();
}
protected synchronized void setChanged() {
changed = true;
}
protected synchronized void clearChanged() {
changed = false;
}
public synchronized boolean hasChanged() {
return changed;
}
public synchronized int countObservers() {
return obs.size();
}
}
當我們自己的被觀察者繼承這個Observable類是,我們就自動的獲取到被觀察者的一切條件了。很方便是不是,這也是為什么sun要把Observable放到java.util包中的原因,就是為了方便開發者。
下面我們再看一下觀察者的接口java.util.Observer
package java.util;
public interface Observer {
void update(Observable o, Object arg);
}
接口中就只有一個方法,update,方法中有兩個參數,Observable和一個object,第一個參數就是被觀察的對象,而第二個參數就得看業務需求了,需要什么就傳進去什么。我們自己的觀察者類必須實現這個方法,這樣在被觀察者調用notifyObservers操作時被觀察者所持有的所有觀察者都會執行update操作了.
三、觀察者模式應用
下面是一個book對象,它是一個被觀察者,所以要繼承Observable。
import java.util.Observable;
public class Book extends Observable {
private String name = "";
private double price = 0.0;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
//當書的價格修改時調用該方法
public void modifyPrice(Book b) {
//調用父類的方法,改變被觀察者的狀態
setChanged();
//通知客戶該書已降價
notifyObservers(b);
}
}
下面是觀察者對象,表示顧客的電子郵件,它實現了Observer接口。
import java.util.Observable;
import java.util.Observer;
public class BuyerEmail implements Observer {
private String buyerId = "";
private String email = "";
public String getBuyerId() {
return buyerId;
}
public void setBuyerId(String buyerId) {
this.buyerId = buyerId;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
//該方法會被“被觀察者的父類”既Observable調用
public void update(Observable o, Object arg) {
//這里做具體發電子郵件的操作
Book b = (Book)arg;
System.out.println("給顧客的發電子郵件:"+b.getName()+"降價了,目前價格為:"+b.getPrice());
}
}
下面是另一個觀察者對象,表示顧客的手機,同樣需要繼承Observer接口
import java.util.Observable;
import java.util.Observer;
public class BuyerMobileMessage implements Observer {
private String buyerId = "";
private String mobileNo = "";
public String getBuyerId() {
return buyerId;
}
public void setBuyerId(String buyerId) {
this.buyerId = buyerId;
}
public String getMobileNo() {
return mobileNo;
}
public void setMobileNo(String mobileNo) {
this.mobileNo = mobileNo;
}
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
Book b = (Book)arg;
System.out.println("給顧客的發手機短信:"+b.getName()+"降價了,目前價格為:"+b.getPrice());
}
}
下面是調用類:
public class MainApp {
public static void main(String args[])
{
Book b1 = new Book();
b1.setName("<>");
b1.setPrice(45.00);//假設原價是60,現在是降價促銷
//下面的觀察者在實際的應用中可以從數據庫或文件中讀取
BuyerMobileMessage bm = new BuyerMobileMessage();
bm.setBuyerId("001");
bm.setMobileNo("13810500085");
BuyerEmail be = new BuyerEmail();
be.setBuyerId("001");
be.setEmail("dobodo@163.com");
//增加觀察者,在實際應用中就是那些人對該書做了關注
b1.addObserver(bm);
b1.addObserver(be);
b1.modifyPrice(b1);
}
}
輸出:
給顧客的發電子郵件:<>降價了,目前價格為:45.0
給顧客的發手機短信:<>降價了,目前價格為:45.0
不知道上面的例子你看懂了沒有,觀察者模式實際上沒什么高深的東西,就是運用了java的繼承和接口,在被觀察者的抽象類里設置一個狀態標志,通過該標志判斷是否通知觀察者對象。在學習該模式的同時,我們更應該學習java的繼承和接口的靈活應用,其實所有的設計模式都是繼承、接口、多態的靈活應用
分享:
喜歡
0
贈金筆
加載中,請稍候......
評論加載中,請稍候...
發評論
登錄名: 密碼: 找回密碼 注冊記住登錄狀態
昵???稱:
評論并轉載此博文
發評論
以上網友發言只代表其個人觀點,不代表新浪網的觀點或立場。
總結
以上是生活随笔為你收集整理的java observer模式_Java观察者模式(Observer)详解及应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java win10 通知,如何使用Ja
- 下一篇: Ajax解析laravelJSON,3分