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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Java设计模式:观察者模式

發(fā)布時(shí)間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式:观察者模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

觀察者模式

觀察者模式又稱為發(fā)布/訂閱(Publish/Subscribe)模式

在對(duì)象之間定義了一對(duì)多的依賴,這樣一來,當(dāng)一個(gè)對(duì)象改變狀態(tài),依賴它的對(duì)象會(huì)收到通知并自動(dòng)更新。

如果這句話不好理解 可以這樣理解,

微信公眾號(hào)發(fā)布消息,訂閱者獲取消息,訂閱了就能收到消息,沒有訂閱就不能收到消息?

?

什么時(shí)候考慮使用觀察者模式?

當(dāng)對(duì)象間存在一對(duì)多關(guān)系時(shí),則使用觀察者模式

?

優(yōu)點(diǎn):?1、觀察者和被觀察者是抽象耦合的。 2、建立一套觸發(fā)機(jī)制。

缺點(diǎn):?1、如果一個(gè)被觀察者對(duì)象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。 2、如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話,觀察目標(biāo)會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。 3、觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對(duì)象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化。

?

下面寫一個(gè)案例:一個(gè)微信公眾號(hào)服務(wù),不定時(shí)發(fā)布一些消息,關(guān)注公眾號(hào)就可以收到推送消息,取消關(guān)注就收不到推送消息

1 抽象被觀察這接口

//抽象被觀察者接口
public interface Observerable {//訂閱void registerObserver(Observer o);//取消訂閱void removeObserver(Observer o);//更新void notifyObserver();
}

?2 抽象觀察者接口

//抽象觀察者接口
public interface Observer {//接受變動(dòng)通知public void update(String message);
}

3? 觀察者實(shí)現(xiàn)接口

// 觀察者,訂閱公眾號(hào)的用戶
public class User implements Observer {private String name;private String message;public User(String name) {// TODO Auto-generated constructor stubthis.name = name;}@Overridepublic void update(String message) {// TODO Auto-generated method stubthis.message = message;read();}private void read() {// TODO Auto-generated method stubSystem.out.println(name + " 收到推送消息: " + message);}}

4 被觀察者實(shí)現(xiàn)接口

import java.util.ArrayList;
import java.util.List;
// 被觀察者, 微信公眾號(hào)
public class WechatServer implements Observerable {//注意到這個(gè)List集合的泛型參數(shù)為Observer接口,設(shè)計(jì)原則:面向接口編程而不是面向?qū)崿F(xiàn)編程private List<Observer> list;private String message;public WechatServer() {list = new ArrayList<Observer>();}@Overridepublic void registerObserver(Observer o){list.add(o);}@Overridepublic void removeObserver(Observer o) {if(!list.isEmpty())list.remove(o);}//遍歷@Overridepublic void notifyObserver(){for(int i = 0; i < list.size(); i++) {Observer oserver = list.get(i);oserver.update(message);}}public void setInfomation(String s) {this.message = s;System.out.println("微信服務(wù)更新消息: " + s);//消息更新,通知所有觀察者notifyObserver();}}

?

測(cè)試

public class Main{	public static void main(String[] args) {//創(chuàng)建微信服務(wù)器對(duì)象 WechatServer server = new WechatServer();//創(chuàng)建多個(gè)用戶對(duì)象User userZhang = new User("ZhangSan");User userLi = new User("LiSi");User userWang = new User("WangWu");//訂閱者用戶接受消息server.registerObserver(userZhang);server.registerObserver(userLi);server.registerObserver(userWang);//微信服務(wù)器發(fā)送消息server.setInfomation("PHP是世界上最好用的語言!");System.out.println("------------華麗的分割線---------------");//張三把訂閱號(hào)給取消了server.removeObserver(userZhang);//微信服務(wù)器修改消息server.setInfomation("JAVA是世界上最好用的語言!");} 
}

?

打印結(jié)果

?

參考地址忘記了,本著學(xué)習(xí)記錄了一下。

總結(jié)

以上是生活随笔為你收集整理的Java设计模式:观察者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。