天天看點

設計模式與應用:觀察者模式簡介結構圖角色和職責實作使用場景

本文介紹觀察者模式,和通過jdk的實作來使用。
  • 簡介
  • 結構圖
  • 角色和職責
  • 實作
  • 使用場景

簡介

觀察者模式Observer是行為模式的一種

作用是當一個對象的狀态發生變化時,能夠自動通知其它關聯對象,自動重新整理對象狀态

Observer模式提供給關聯對象一種同步通信的手段,使得某個對象與依賴他的其它對象之間保持狀态同步

結構圖

設計模式與應用:觀察者模式簡介結構圖角色和職責實作使用場景

實際上,jdk已經有相關的實作,在

java.util

包中:

public interface Observer

作為觀察者。一個可在觀察者要得到 observable 對象更改通知時可實作 Observer 接口的類。

java.util.Observable

作為被觀察者。可将其子類化,表示應用程式想要觀察的對象。

具體可看文檔

角色和職責

  • Subject(被觀察者):被觀察的對象。當需要被觀察的狀态發生變化時,需要通知隊列中所有的觀察者對象。Subject需要維持(添加、删除、通知)一個觀察者對象的隊列清單。
  • Concrete subject:被觀察者的具體實作。包含一些基本的屬性狀态及其它操作
  • Observer(觀察者):接口或抽象類。當Subject的狀态發生變化時,Observer對象将通過一個CallBack函數得到通知
  • Concrete observer:觀察者的具體實作。得到通知後将完成一些具體業務邏輯處理

實作

設計模式與應用:觀察者模式簡介結構圖角色和職責實作使用場景

具體被觀察者

package com.mym.designmodel.observer;

import java.util.Observable;

/**
 * 職責:Concrete Subject(被觀察者)被觀察的對象
 */
public class BlogUser extends Observable{

    public void publishBlog(String title,String content){
        Blog blog = new Blog();
        blog.setTitle(title);
        blog.setContent(content);
        System.out.println("部落客釋出新文章,标題:"+title+",内容:"+content);
        this.setChanged();              //辨別狀态改變
        this.notifyObservers(blog);     //通知觀察者,并傳參數
    }
}
           

觀察者

package com.mym.designmodel.observer;

import java.util.Observable;
import java.util.Observer;

/**
 * 職責:Concrete observer:觀察者的具體實作。得到通知後将完成一些具體業務邏輯處理
 */
public class EditorObserver  implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        Blog blog = (Blog) arg;
        System.out.println(" EditorObserver 收到部落客的釋出消息,釋出的文章标題為:"+blog.getTitle()+"   内容為:"+blog.getContent());
    }
}
           

觀察者2

package com.mym.designmodel.observer;

import java.util.Observable;
import java.util.Observer;

/**
 * 職責:Concrete observer:觀察者的具體實作。得到通知後将完成一些具體業務邏輯處理
 */
public class ReaderObserver implements Observer{
    @Override
    public void update(Observable o, Object arg) {
        Blog blog = (Blog) arg;
        System.out.println(" ReaderObserver 收到部落客的釋出消息,釋出的文章标題為:"+blog.getTitle()+"   内容為:"+blog.getContent());
    }
}
           

文章

package com.mym.designmodel.observer;

public class Blog {
    private String title;//标題

    private String content;//内容

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}
           

用戶端client

package com.mym.designmodel.observer;

/**
 * 測試
 */
public class MainClass{
    public static void main(String[] args) {
        BlogUser blogUser = new BlogUser();
        //添加觀察者
        blogUser.addObserver(new ReaderObserver());
        blogUser.addObserver(new EditorObserver());

        blogUser.publishBlog("講述Observer Model","這裡是文章正文!");
    }

}
           

執行:

部落客釋出新文章,标題:講述Observer Model,内容:這裡是文章正文!
 EditorObserver 收到部落客的釋出消息,釋出的文章标題為:講述Observer Model   内容為:這裡是文章正文!
 ReaderObserver 收到部落客的釋出消息,釋出的文章标題為:講述Observer Model   内容為:這裡是文章正文!
           

使用場景

根據介紹可知。類似于消息訂閱使用模型的場景都可以使用這個模式,并且jdk本身就提供了實作,很友善

繼續閱讀