程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java設計形式之察看者形式

java設計形式之察看者形式

編輯:關於JAVA

java設計形式之察看者形式。本站提示廣大學習愛好者:(java設計形式之察看者形式)文章只能為提供參考,不一定能成為您想要的結果。以下是java設計形式之察看者形式正文


   察看者形式又稱發布-訂閱(Publish/Subscribe)形式,定義了一種一對多的依賴關系,讓多個察看者對象同時監聽某一個主題對象。這個主題對象在形態發作變化時,會告訴一切察看者對象,使他們可以自動更新自己。將一個零碎聯系成一系列互相協作的類有一個很不好的反作用,那就是需求維護相關對象間的分歧性。我們不希望為了維持分歧性而使各類嚴密耦合,這樣會給維護、擴展和復用都帶來方便。察看者形式所做的任務其實就是在解除耦合,讓耦合的單方都依賴於籠統,而不是依賴於詳細。

  察看者形式是實踐中使用比擬普遍的形式,其使用場景比方,一台消費大米的工廠,和n個銷售大米的商家,n個商家首先在這個工廠注冊一下本身的聯絡方式,當工廠消費出一定量的大米後,再按照聯絡方式告訴這n個商家來取貨。這個例子當中用到了察看者形式中的注冊(Attach)和告訴(Notify),即當告訴者的形態改動時,順次告訴各個察看者。

  Subject是籠統告訴者,Observer是籠統察看者。假如要創立的派生類是風馬牛不相及的對象,可以思索運用接口完成若干個相反的辦法。  

  Java代碼如下:

abstract class Subject {
  private ArrayList<Observer> observersList = new ArrayList<Observer>();
  
  // add observers
  public void Attach(Observer ob) {
    observersList.add(ob);
  }
  
  // remove observers
  public void Detach(Observer ob) {
    observersList.remove(ob);
  }
  
  public void Notify()
  {
    for (Observer ob : observersList) {
      ob.Update();
    }
  }
}

abstract class Observer {
  public abstract void Update();
}

public class ConcreteObserver extends Observer {
  private String name;
  private String observerStatus;
  private ConcreteSubject subject;
  
  public ConcreteObserver(ConcreteSubject subject, String name)
  {
    this.subject = subject;
    this.name = name;
  }
  
  public void Update() 
  {
    observerStatus = subject.getSubjectStatus();
  }  
}

public class ConcreteSubject extends Subject {
  private String subjectStatus;

  public String getSubjectStatus() {
    return subjectStatus;
  }

  public void setSubjectStatus(String subjectStatus) {
    this.subjectStatus = subjectStatus;
  }

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    ConcreteSubject s = new ConcreteSubject();

    s.Attach(new ConcreteObserver(s, "X"));
    s.Attach(new ConcreteObserver(s, "Y"));
    s.Attach(new ConcreteObserver(s, "Z"));
    
    s.setSubjectStatus("Ready");
    s.Notify();
  }
}

  上述代碼中,有籠統察看者和籠統告訴者。當Subject的形態改動之後,調用函數即可告訴在其外部注冊過的察看者。這種設計的思想在平常生活中也是比擬罕見的,就比方掃尾提到的消費大米的廠家和銷售大米的商家。再來一個使用場景,比方書店中某一本書缺貨了,顧客還是想買的話,可以停止注銷,等到貨後,書店老板會打電話順次告訴想買書的顧客。這種注冊的機制在其他的編程技巧中也是有很多表現的。比方順序向底層庫注冊多個回調函數,當條件滿足時,底層庫就會告訴(或許說調用)最下層提供的回調函數。

  上述代碼是Java寫的,C++的話也是相似,次要是Subject保管Observer的指針。但是C++要思索釋放內存的問題,留意當Observer自身要被銷毀時,必需要調用Subject的Detach函數,否則Update時能夠會呈現運用野指針形成crash的問題。可以思索運用Subject管理Observer的生命周期。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved