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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java Observer Pattern(观察者模式)

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

當(dāng)對(duì)象間存在一對(duì)多關(guān)系時(shí),則使用觀察者模式(Observer Pattern)。比如,當(dāng)一個(gè)對(duì)象被修改時(shí),則會(huì)自動(dòng)通知它的依賴對(duì)象。觀察者模式屬于行為型模式。

關(guān)鍵代碼:在抽象類里有一個(gè) ArrayList 存放觀察者們。

優(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ā)生了變化。

注意事項(xiàng): 1、JAVA 中已經(jīng)有了對(duì)觀察者模式的支持類。 2、避免循環(huán)引用。 3、如果順序執(zhí)行,某一觀察者錯(cuò)誤會(huì)導(dǎo)致系統(tǒng)卡殼,一般采用異步方式。

  • 創(chuàng)建 Observer 類。
  • /*** 1. 創(chuàng)建 Observer 類。* @author mazaiting*/ public abstract class Observer {protected Subject subject;public abstract void update(); }
  • 創(chuàng)建 Subject 類。
  • /*** 2. 創(chuàng)建 Subject 類。* @author mazaiting*/ public class Subject {private List<Observer> observers = new ArrayList<Observer>();private int state;public int getState() {return state;}public void setState(int state) {this.state = state;notifyAllObservers();}/*** 添加觀察者*/public void attach(Observer observer){observers.add(observer);}/*** 通知全部觀察者更新數(shù)據(jù)*/public void notifyAllObservers(){for (Observer observer : observers) {observer.update();}} }
  • 創(chuàng)建實(shí)體觀察者類
  • /*** 3. 創(chuàng)建實(shí)體觀察者類。* @author mazaiting*/ public class BinaryObserver extends Observer{public BinaryObserver(Subject subject) {this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Binary String: " + Integer.toBinaryString(subject.getState())); }}/*** 3. 創(chuàng)建實(shí)體觀察者類。* @author mazaiting*/ public class OctalObserver extends Observer{public OctalObserver(Subject subject) {this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) );}}/*** 3. 創(chuàng)建實(shí)體觀察者類。* @author mazaiting*/ public class HexaObserver extends Observer{public HexaObserver(Subject subject) {this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() ); }}
  • 使用Subject和實(shí)體觀察者對(duì)象
  • /*** 4. 使用 Subject 和實(shí)體觀察者對(duì)象。* @author mazaiting*/ public class Client {public static void main(String[] args) {Subject subject = new Subject();new HexaObserver(subject);new OctalObserver(subject);new BinaryObserver(subject);System.out.println("First state change: 15");subject.setState(15);System.out.println("Second state change: 10");subject.setState(10);} }
  • 打印結(jié)果
  • First state change: 15 Hex String: F Octal String: 17 Binary String: 1111 Second state change: 10 Hex String: A Octal String: 12 Binary String: 1010

    總結(jié)

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

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