設計模式-觀察者模式(Observer)
阿新 • • 發佈:2018-12-04
觀察者模式是行為模式的一種,它的作用是當一個物件的狀態發生變化時,能夠自動通知關聯物件,自動重新整理物件狀態。
觀察者模式提供給關聯物件一種同步通訊的手段,使某個物件與依賴它的其他物件之間保持狀態同步。
角色和職責:
1.被觀察者(Observable)-:
被觀察者物件,當需要被觀察者的狀態發生變化時,需要通知佇列中所有觀察者物件。Subject需要維持(新增,刪除,通知)一個觀察者物件的佇列列表。
2.被觀察者具體實現(Concrete Observable)-:
被觀察者具體實現,包含一些基本的屬性狀態及其他操作
3.觀察者(Observer):
當subject狀態發生變化時,Observer物件將通過一個callback函式得到通知
4.觀察者具體實現(Concrete Observer):
觀察者具體實現,得到通知後將完成一些具體的業務邏輯處理
UML圖:
具體程式碼:
/** * 文章 */ public class Article { private String articleTitle;//文章標題 private String articleContent;//文章內容 public String getArticleTitle() { return articleTitle; } public void setArticleTitle(String articleTitle) { this.articleTitle = articleTitle; } public String getArticleContent() { return articleContent; } public void setArticleContent(String articleContent) {this.articleContent = articleContent; } }
import java.util.Observable; /** * 訂閱號 */ public class Subject extends Observable { /** * 新增文章 */ public void insertArticle(Article article){ //新增一篇文章 System.out.println("新增一篇文章"); this.setChanged();//觀察者模式標記已更改 this.notifyObservers(article);//告訴訂閱者,這邊的通知是依次通知 } }
import java.util.Observable; import java.util.Observer; /** * 訂閱者1 */ public class Observer1 implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("訂閱者1,收到訂閱號的通知"); Article article = (Article)arg; System.out.println("標題:"+article.getArticleTitle()+",內容:"+article.getArticleContent()); } }
import java.util.Observable; import java.util.Observer; /** * 訂閱者2 */ public class Observer2 implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("訂閱者2,收到訂閱號的通知"); Article article = (Article)arg; System.out.println("標題:"+article.getArticleTitle()+",內容:"+article.getArticleContent()); } }
public class Main { public static void main(String[] args) { Article article = new Article(); article.setArticleTitle("圓周率的實現"); article.setArticleContent("圓是一個圓圈。。。"); Subject subject = new Subject();//訂閱號 subject.addObserver(new Observer1());//訂閱者1 subject.addObserver(new Observer2());//訂閱者2 subject.insertArticle(article);//訂閱號新增一篇文章 } }
結果:
新增一篇文章
訂閱者2,收到訂閱號的通知
標題:圓周率的實現,內容:圓是一個圓圈。。。
訂閱者1,收到訂閱號的通知
標題:圓周率的實現,內容:圓是一個圓圈。。。
應用場景:
- 傾聽事件驅動程式設計中的外部事件
- 監聽某個物件的狀態變化
- 釋出者/訂閱者模型中,當一個外部被觸發時,通知郵件列表中的訂閱者
原始碼地址:https://github.com/qjm201000/design_pattern_observer.git