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

歡迎訪問 生活随笔!

生活随笔

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

java

Java常用设计模式——观察者模式

發布時間:2025/3/12 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java常用设计模式——观察者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

導航

  • 一、行為描述
  • 二、角色關系
  • 三、代碼示例

一、行為描述

觀察者會觀察特定對象的狀態變化,一旦狀態有所變化或產生特定條件,被觀察對象會通知給觀察者,
而觀察者則會依據通知信息采取特定處理措施。

舉個例子,公司接到了一個大項目,各個部門都在觀察項目的進度,一旦洽談成功,項目正式進入啟動階段,
那么設計部就會出圖紙,開發部就會出流程、出架構,售前部就會跑現場實地勘測…
項目就是被觀察者,而各個部門就是觀察者。

二、角色關系

觀察者模式就兩種角色——觀察者和被觀察者。

觀察者對象往往會規范結構,一般是繼承一個抽象觀察者

I. 抽象觀察者會定義3個重要內容

  • 被觀察對象的引用
  • 構造函數——賦值被觀察者、將this加入觀察席
  • 通知函數
  • II. 子類觀察者僅調用父類構造,并實現通知函數即可。

    III. 被觀察者需要定義 4 個重要內容:

  • 狀態變量。這是觀察者存在的目的和關鍵。
  • 觀察席。簡單的說就是一個容納觀察者對象的容器,可以是List、也可以是Map,甚至是數組。
  • 入席函數。觀察者應該在構造的時候通過入席函數將自身加入到觀察席容器中。
  • 廣播函數。與觀察者的通知函數一樣,被觀察者應該在狀態變化時(可以是 setter 函數)調用觀察席中各個觀察者的通知方法。
  • 三、代碼示例

    抽象觀察者:

    /*** 觀察者*/ @Data public abstract class Observer {/*** 被觀察對象*/protected ObserveTarget target;/*** 構造觀察者時,直接建立觀察者與被觀察者的關系*/public Observer(ObserveTarget target) {this.target = target;target.getObservers().add(this);}/*** 接收廣播消息*/abstract void recvMsg(); }

    觀察者1、觀察者2:

    /*** 觀察者1號*/ public class Observer1 extends Observer {public Observer1(ObserveTarget target) {super(target);}@Overridevoid recvMsg() {System.out.println("Observer1-state = " + target.getState());} } /*** 觀察者2號*/ public class Observer2 extends Observer {public Observer2(ObserveTarget target) {super(target);}@Overridevoid recvMsg() {// 觀察者可以視情況選擇性處理接收的消息if (target.getState() == 1)System.out.println("Observer2-state = " + target.getState());} }

    被觀察者:

    /*** 被觀察目標*/ @Data public class ObserveTarget {/*** 狀態變量*/private volatile int state;/*** 觀察席(觀察者容器)*/private Collection<Observer> observers = new ArrayList<>();/*** 入席函數(新增觀察者)*/public void addObserver(Observer observer) {observers.add(observer);}public void setState(int state) {this.state = state;// 發送廣播通知broadcast();}/*** 廣播函數*/private void broadcast() {observers.forEach(o -> o.recvMsg());} }

    測試代碼:

    public class TestObserve {public static void main(String[] args) {ObserveTarget target = new ObserveTarget();Observer1 observer1 = new Observer1(target);Observer2 observer2 = new Observer2(target);target.setState(1);target.setState(2);target.setState(3);} } // output: Observer1-state = 1 Observer2-state = 1 Observer1-state = 2 Observer1-state = 3

    總結

    以上是生活随笔為你收集整理的Java常用设计模式——观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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