觀察者模式是一種多對一的關係,即多個觀察者對象 觀察 一個被觀察者對象,當被觀察者對象狀態發生變化時,能自動通知觀察者對象執行相應動作。
觀察者模式提供給關聯對象的一種同步通信的方式,下面來看結構圖(截自 程傑 大化設計模式)
兩個角色:
Subject:被觀察者,一般爲一個抽象類或接口,其中有一個聚集保存所有註冊的觀察者,一個方法用於通知所有的觀察者,Subject需要維持(添加,刪除,通知)一個觀察者對象的隊列列表。
Observer: 觀察者,抽象類或接口,有一個更新接口,更新自己的狀態。
Java的Util中已實現這兩個工具, Suject 爲 java.util.Observable,查看jdk手冊可知主要方法,其中要注意的是 setChanged() 方法,在通知之前必須調用該方法確認狀態改變,否則通知不生效。
Observer接口:就一個update()方法。
以下來看例子:被觀察者爲博主,觀察者爲粉絲
1、文章類 Article
package com.zewe.observer;
/**
* 文章類
* @author ZeWe
*
*/
public class Article {
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;
}
public String show(){
return "標題:"+title+" , 內容:"+content;
}
}
2、博主類:BlogUser
package com.zewe.observer;
import java.util.Observable;
/**
* 博主
* @author ZeWe
*
*/
public class BlogUser extends Observable{
private String name;
public BlogUser(String name) {
super();
this.name = name;
}
public void publicBlog(String title, String content){
Article art = new Article();
art.setTitle(title);
art.setContent(content);
System.out.println(name +"發表文章, "+art.show());
this.setChanged(); // 發表文章動作確認
this.notifyObservers(art); // 通知所有觀察者
}
}
3、粉絲類:Fans
package com.zewe.observer;
import java.util.Observable;
import java.util.Observer;
/**
* 粉絲
* @author ZeWe
*
*/
public class Fans implements Observer{
private String name;
public Fans(String name) {
super();
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
Article art = (Article) arg;
System.out.println("粉絲"+name+"接收通知:"+art.show());
}
}
4、執行方法
package com.zewe.observer;
public class MainTest {
public static void main(String[] args) {
BlogUser zewe = new BlogUser("ZeWe");
Fans xiaoming = new Fans("小明");
Fans tiezhu = new Fans("鐵柱");
//粉絲關注
zewe.addObserver(xiaoming);
zewe.addObserver(tiezhu);
zewe.publicBlog("觀察者模式", "設計模式學習觀察者模式 ......");
}
}
// 結果:
/**
ZeWe發表文章, 標題:觀察者模式 , 內容:設計模式學習觀察者模式 ......
粉絲鐵柱接收通知:標題:觀察者模式 , 內容:設計模式學習觀察者模式 ......
粉絲小明接收通知:標題:觀察者模式 , 內容:設計模式學習觀察者模式 ......
**/