日韩性视频-久久久蜜桃-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)详解及应用的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 精品久久无码中文字幕 | 久久久久久久久久久网 | 欧美第三页 | 93看片淫黄大片一级 | 九九色综合网 | 成人黄色网页 | 禁久久精品乱码 | av噜噜在线 | 美女在线一区 | jizz国产在线| 黄色一级淫片 | 妞干网这里只有精品 | 三年中文免费观看大全动漫 | 末发成年娇小性xxxxx | 三级毛毛片 | 日本少妇xxxxx | 91精品综合久久久久久五月天 | 欧美成人福利 | 中文字幕乱码无码人妻系列蜜桃 | 亚洲综合涩 | 国产老熟妇精品观看 | 成人3d动漫一区二区三区 | av图区| 亚洲精品综合久久 | 无码人妻精品一区二区三区99不卡 | 亚洲破处视频 | 亚洲精品高清视频 | 狠狠操在线播放 | 91日本视频| 男人的天堂视频 | 男人插女人免费视频 | 亚洲av无码专区国产乱码不卡 | 国产一级片播放 | 国内久久| 中文字幕+乱码+中文乱码91 | 美日韩一二三区 | 奇米色综合 | 国产粉嫩一区二区三区 | 伊人久久大香线蕉 | 成人在线免费视频播放 | 日韩电影在线观看一区 | 午夜国产福利在线 | 亚洲第一av在线 | 非洲黑人狂躁日本妞 | 亚洲综合久久av一区二区三区 | 午夜激情综合网 | 精品久久久久久久久久久久久久久久久 | 91精品国产一区二区三区蜜臀 | 91国产网站 | 少妇喷潮明星 | 日日日夜夜操 | 国产在线日韩 | 亚洲欧美激情另类校园 | 一区二区免费在线观看视频 | 国外成人免费视频 | 亚洲色图20p| 天码人妻一区二区三区在线看 | 性感美女毛片 | 欧美wwwxxxx| 欧美日本国产 | 亚洲性免费 | 久久久久久国产视频 | 性视频播放免费视频 | 91香蕉久久 | 中文字幕日韩精品一区 | 久久久久久久无码 | 影音先锋久久 | 日日麻批 | 人妻在线一区二区三区 | 在线观看av资源 | 亚洲精品91| 在线观看网站av | 亚洲最大福利 | 日韩成人小视频 | 好吊日免费视频 | 日韩欧美一区二区在线 | 色小姐av | 五月天激情视频 | 久久久久亚洲视频 | 女女互慰吃奶互揉调教捆绑 | 亚洲天堂成人在线 | 少妇一区二区三区 | 国产ts丝袜人妖系列视频 | 国产第五页 | 亚洲精品中文字幕乱码三区91 | av88av| 播播开心激情网 | 免费无遮挡无码永久在线观看视频 | 91视频在线观看免费 | 久久久精品久久久久久 | av色资源 | 99视频导航 | 色女孩综合 | 黄网视频在线观看 | 体内精69xxxxxx| 精品久久久999 | 黄色成人免费观看 | 一区免费在线观看 | 久草麻豆 |