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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

java

java 观察者模式_Java技术干货分享:深入理解观察者模式原理与技术

發(fā)布時(shí)間:2023/12/10 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 观察者模式_Java技术干货分享:深入理解观察者模式原理与技术 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
來(lái)源:編程技術(shù)精選

觀察者模式(Observer Pattern)也叫做發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式。這個(gè)模式的一個(gè)最重要的作用就是解耦。也就是將被觀察者和觀察者進(jìn)行解耦,使得他們之間的依賴性更小,甚至做到毫無(wú)依賴。

觀察者模式的定義:該模式定義了對(duì)象之間的一對(duì)多依賴關(guān)系,Subject 對(duì)象是一,Observer 對(duì)象是多。當(dāng) Subject 對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于該 Subject 對(duì)象的 Observer 對(duì)象都會(huì)得到通知,并且自動(dòng)更新。

仔細(xì)分析定義,要精確理解觀察者模式主要注意三點(diǎn):

  • 定義了對(duì)象間的一對(duì)多依賴關(guān)系。
  • 當(dāng) Subject 對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于該 Subject 對(duì)象的 Observer 對(duì)象都會(huì)得到通知。
  • Observer 對(duì)象得到通知后,會(huì)自動(dòng)更新,而不是被動(dòng)。
  • 經(jīng)過(guò)上面的分析,下面我用代碼簡(jiǎn)單實(shí)現(xiàn)上述邏輯。

    1.首先需要定義一個(gè)觀察者對(duì)象,內(nèi)部含有data數(shù)據(jù)(getter、setter、構(gòu)造方法、toString)。

    public class Observer { private String data; public Observer(String data) { this.data = data; } public String getData() { return data; } public void setData(String data) { this.data = data; } @Override public String toString() { return "Observer{" + "data='" + data + ''' + '}'; }}

    2.其次定義主題對(duì)象,主題對(duì)象內(nèi)部提供觀察者綁定(register)的接口,并且可以更新(update)所綁定的觀察者對(duì)象。

    public class Subject { private List list = new ArrayList<>(); public void register(Observer observer){ list.add(observer); } public void update(){ list.forEach(observer -> { observer.setData("new"); System.out.println(observer.toString()); }); }}

    3.最后就是main方法。

    public static void main(String[] args) { Subject subject = new Subject(); for (int i = 0; i < 3; i++) { Observer observer = new Observer("old"); subject.register(observer); System.out.println(observer.toString()); } System.out.println("update..."); subject.update(); }

    控制臺(tái)打印

    Observer{data='old'}Observer{data='old'}Observer{data='old'}update...Observer{data='new'}Observer{data='new'}Observer{data='new'}

    看到這里你也許會(huì)問(wèn):這就是觀察者模式?這么簡(jiǎn)單?你莫不是在逗我?

    是的,這就是觀察者模式。我們從觀察者模式的定義出發(fā),抽取出關(guān)鍵的3點(diǎn)核心思想,對(duì)比代碼和三點(diǎn)思想,是不是完美一致?百度一下"觀察者模式",實(shí)現(xiàn)邏輯大都是復(fù)雜高深,其實(shí)就核心的思想來(lái)說(shuō),上面的示例足夠了,其它擴(kuò)展要以具體的業(yè)務(wù)需求來(lái)決定。比如:

  • Subject 角色是應(yīng)該定義成類?比如 內(nèi)置的 java.util.Observable;還是應(yīng)該定義成接口,以規(guī)避Java不支持多重繼承的問(wèn)題?
  • 應(yīng)該在什么時(shí)候訂閱主題(或者說(shuō)注冊(cè)觀察者)?是實(shí)例化觀察者對(duì)象的同時(shí)?還是由客戶自主決定?
  • 是否應(yīng)該實(shí)現(xiàn)取消訂閱功能(或者說(shuō)取消注冊(cè))?
  • 主題對(duì)象通知觀察者時(shí),是否攜帶消息?換句話說(shuō),是“推”消息?還是“拉”消息?
  • 是否支持多線程?
  • end:如果你覺(jué)得本文對(duì)你有幫助的話,記得關(guān)注點(diǎn)贊轉(zhuǎn)發(fā),你的支持就是我更新動(dòng)力。

    總結(jié)

    以上是生活随笔為你收集整理的java 观察者模式_Java技术干货分享:深入理解观察者模式原理与技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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