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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

『设计模式』以为是个王者,后来班主任来了!设计模式--二五仔的观察者模式

發布時間:2023/12/15 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 『设计模式』以为是个王者,后来班主任来了!设计模式--二五仔的观察者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

23種設計模式+額外常用設計模式匯總 (持續更新)

觀察者模式


高中的時候,班里有個兩個同學太困了,就鉆到桌子地下睡覺,結果被班主任抓包,打斷了跟拖把,雖然面臨高考還能這么淡定也是個人才。
怎么回事呢?
劉某被老師長期罰坐在門外上課!于是鄭某每天幫劉某買飯,劉某成為了鄭某的眼線,看到班主任來就把他叫起來。這樣相安無事過了幾天,然而事實證明劉某是靠不住的,今天劉某也睡著了,然后班主任親自叫醒了劉某,然后帶著劉某叫醒了班里熟睡的鄭某,這樣劉鄭二人雙雙被打,直到拖把桿被打斷。最后一個體育生鄭dh跑進了中國礦業大學,另一個睡著了沒離開又復讀了一年!
這不就是觀察者模式嗎?
你可能認為劉某是觀察者,其實鄭某才是觀察者,他觀察劉某的動態,然后做出反饋,有點違背我們平時的理解。啪~ 啪 ~ 啪~!請看下文!
  
觀察者模式又叫做:

  • 模型-視圖(Model/View)模式
  • 源-監聽器(Source/Listener)模式
  • 從屬者(Dependents)模式

腦海中立刻閃現了《Head First設計模式》里講的:

Publishers + Subscribers = Observer Pattern

他還應該叫發布訂閱模式?但是確實不是,之前我混為一談確實不對!這篇文章比較詳細的講解他們兩個區別,并給出了源代碼及實例,有興趣的可以看一下。
發布者訂閱者模式到底是個啥?看這!

意圖:

觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

一個軟件系統常常要求在某一個對象的狀態發生變化的時候,某些其它的對象做出相應的改變。做到這一點的設計方案有很多,是為了使系統能夠易于復用,應該選擇低耦合度的設計方案為了使系統能夠易于復用,應該選擇低耦合度的設計方案。

減少對象之間的耦合有利于系統的復用,但是同時設計師需要使這些低耦合度的對象之間能夠維持行動的協調一致,保證高度的協作( Collaboration)。觀察者模式是滿足這一要求的各種設計方案中最重要的一種。

主要解決:

一個對象狀態改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協作。

何時使用:

一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。

如何解決:

使用面向對象技術,可以將這種依賴關系弱化,從而降低耦合性,避免循環觀察形成死鎖。

關鍵代碼:

在抽象類里有一個 ArrayList 存放觀察者們。

UML圖:

觀察者模式(Observer), 定義對象間一種一對多的依賴關系,使得每當一個對象改變狀態,則所有依賴于它的對象都會得到通知并自動更新。UML結構圖如下:

優點:
  • 1.觀察者和被觀察者是抽象耦合的。
  • 2.建立一套觸發機制:
    • 觀察者模式實現了動態聯動
    • 觀察者模式支持廣播通信。被觀察者會向所有的登記過的觀察者發出通知。
缺點:
  • 可能存在無用的操作:
    由于采用廣播模式,不管觀察者是否需要,都會被通知調用Update()方法!
  • 如果在觀察者和觀察目標之間有循環依賴的話,觀察目標會觸發它們之間進行循環調用,可能導致系統崩潰。
  • 觀察者模式沒有相應的機制讓觀察者知道所觀察的目標對象是怎么發生變化的,而僅僅只是知道觀察目標發生了變化。
  • 使用場景:

    • 一個抽象模型有兩個方面,其中一個方面依賴于另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復用。
    • 一個對象的改變將導致其他一個或多個對象也發生改變,而不知道具體有多少對象將發生改變,可以降低對象之間的耦合度。
    • 一個對象必須通知其他對象,而并不知道這些對象是誰。
    • 需要在系統中創建一個觸發鏈,A對象的行為將影響B對象,B對象的行為將影響C對象……,可以使用觀察者模式創建一種鏈式觸發機制。

    注意事項

    目標和觀察者之間的關系:

    • 典型的一對多的關系

    單向依賴:

    • 觀察者依賴于目標

    觸發通知的時機:

    • 完成了狀態維護后觸發

    相互觀察:

    • A、B觀察C,B、C觀察A(兩套觀察模式)
    • 注意死循環

    通知的順序

    • 絕對不要依賴于通知的順序,多個觀察者之間的功能是平行的,相互不應該有先后的依賴關系

    實現:

    抽象主題(Subject)角色:
    • 一個目標可以被多個觀察者觀察
    • 目標提供對觀察者注冊和退訂的維護
    • 當目標的狀態發生變化時,目標負責通知所有注冊的、有效地觀察者

    首先定義一個觀察者數組,并實現增、刪及通知操作。它的職責很簡單,就是定義誰能觀察,誰不能觀察,用Vector是線程同步的,比較安全,也可以使用ArrayList,是線程異步的,但不安全。

    public class Subject {//觀察者數組private Vector<Observer> oVector = new Vector<>();//增加一個觀察者public void addObserver(Observer observer) {this.oVector.add(observer);}//刪除一個觀察者public void deleteObserver(Observer observer) {this.oVector.remove(observer);}//通知所有觀察者public void notifyObserver() {for(Observer observer : this.oVector) {observer.update();}} }
    抽象觀察者Observer
    • 為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己。這個接口叫做更新接口。
    • 抽象觀察者角色一般用一個抽象類或者一個接口實現。在這個示意性的實現中,更新接口只包含一個方法(即Update()方法),這個方法叫做更新方法。
    public interface Observer {//更新public void update(); }
    具體主題 (ConcreteSubject)

    繼承Subject類,在這里實現具體業務,在具體項目中,該類會有很多變種。
    將有關狀態存入具體現察者對象;在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色又叫做具體被觀察者角色(Concrete Observable)具體主題角色通常用一個具體子類實現。

    public class ConcreteSubject extends Subject {//具體業務public void doSomething() {//...super.notifyObserver();}}
    具體觀察者(ConcreteObserver)

    具體現察者角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態相協調。如果需要,具體現察者角色可以保存一個指向具體主題對象的引用。具體觀察者角色通常用一個具體子類實現。

    public class ConcreteObserver implements Observer {@Overridepublic void update() {System.out.println("收到消息,進行處理");}}
    Client客戶端

    首先創建一個被觀察者,然后定義一個觀察者,將該被觀察者添加到該觀察者的觀察者數組中,進行測試。

    public class Client {public static void main(String[] args) {//創建一個主題ConcreteSubject subject = new ConcreteSubject();//定義一個觀察者Observer observer = new ConcreteObserver();//觀察subject.addObserver(observer);//開始活動subject.doSomething();}}

    觀察者模式的應用

    在實際應用中,抽象觀察者Observer在C#和java中都已經被實現,我們可以直接使用。
    • Java中的觀察者模式
      java.util.Observable,實現了大部分我們需要的目標的功能,還有一個接口Observer,其中定義了update方法,就是觀察者的接口。在java9以后被棄用,棄用原因,后續將會填坑通過監聽來重新實現觀察者模式!
    • C#的Observer模式
      實際上在C#中實現Observer模式沒有這么辛苦,.NET中提供了Delegate與Event機制,我們可以利用這種機制簡化Observer模式。基于.NET簡化的觀察者模式。

    舉個例子:
    那天博主的股票上市了,你們買了我的股票,我的股票漲了跌了得通知你們,我們就按照這個寫一個。

    package 觀察者模式;public interface Observer {public void update(Object c); } package 觀察者模式;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Vector;public class Subject {private Vector<Observer> oVector;public Subject() {oVector=new Vector<Observer>();}public void addObserver(Observer observer) {this.oVector.add(observer);}public void deleteObserver(Observer observer) {this.oVector.remove(observer);}public void notifyObserver() {SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d = new Date( );sf.format(d);for (Observer observer : this.oVector) {observer.update(d);}} } package 觀察者模式;public class Share_Observer implements Observer {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void update(Object c) {System.out.println(name+"已更新股票數據"+c);}} package 觀察者模式;public class Shares_Subject extends Subject {public void RealTime_Update() {super.notifyObserver();}} package 觀察者模式;public class Client {public static void main(String[] args) {Shares_Subject subject = new Shares_Subject();Share_Observer observer = new Share_Observer();observer.setName("張俊浩的A股");subject.addObserver(observer);subject.RealTime_Update();} }


    寫在最后:
    我叫風骨散人,名字的意思是我多想可以不低頭的自由生活,可現實卻不是這樣。家境貧寒,總得向這個世界低頭,所以我一直在奮斗,想改變我的命運給親人好的生活,希望同樣被生活綁架的你可以通過自己的努力改變現狀,深知成年人的世界里沒有容易二字。目前是一名在校大學生,預計考研,熱愛編程,熱愛技術,喜歡分享,知識無界,希望我的分享可以幫到你!
    如果有什么想看的,可以私信我,如果在能力范圍內,我會發布相應的博文!
    謝謝大家的閱讀!😘

    總結

    以上是生活随笔為你收集整理的『设计模式』以为是个王者,后来班主任来了!设计模式--二五仔的观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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