日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java observer模式_Java观察者模式(Observer)详解及应用

發布時間:2025/3/11 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)详解及应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。