1. 程式人生 > >設計模式-觀察者模式(Observer)

設計模式-觀察者模式(Observer)

觀察者模式是行為模式的一種,它的作用是當一個物件的狀態發生變化時,能夠自動通知關聯物件,自動重新整理物件狀態。

觀察者模式提供給關聯物件一種同步通訊的手段,使某個物件與依賴它的其他物件之間保持狀態同步。

角色和職責:

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