本文介紹觀察者模式,和通過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本身就提供了實作,很友善