Java設計模式之觀察者模式(釋出/訂閱模式)
阿新 • • 發佈:2019-01-03
1、概述
觀察者模式又稱為釋出/訂閱(Publish/Subscribe)模式
觀察者設計模式涉及到兩種角色:主題(Subject)和觀察者(Observer)
(1)Subject模組
Subjec模組有3個主要操作
- addObserver():註冊新增觀察者(申請訂閱)
- deleteObserver():刪除觀察者(取消訂閱)
- notifyObserver():主題狀態發生變化時通知所有的觀察者物件
(2)Oserver模組
Oserver模組有1個核心操作update(),當主題Subject狀態改變時,將呼叫每個觀察者的update()方法,更新通知。
2、簡單樣例
(1)主題介面
package observer;
public interface Subject {
//新增觀察者
void addObserver(Observer obj);
//移除觀察者
void deleteObserver(Observer obj);
//當主題方法改變時,這個方法被呼叫,通知所有的觀察者
void notifyObserver();
}
(2)觀察者介面
package observer;
public interface Observer {
//當主題狀態改變時,更新通知
public void update(int version);
}
(3)主題實現類,某某雜誌
package observer;
import java.util.ArrayList;
import java.util.List;
public class MagazineSubject implements Subject{
//存放訂閱者
private List<Observer> observers=new ArrayList<Observer>();
//期刊版本
private int version;
@Override
public void addObserver(Observer obj) {
observers.add(obj);
}
@Override
public void deleteObserver(Observer obj) {
int i = observers.indexOf(obj);
if(i>=0){
observers.remove(obj);
}
}
@Override
public void notifyObserver() {
for(int i=0;i<observers.size();i++){
Observer o=(Observer)observers.get(i);
o.update(version);
}
}
//該雜誌發行了新版本
public void publish(){
//新版本
this.version++;
//資訊更新完畢,通知所有觀察者
notifyObserver();
}
}
(4)觀察者實現類
package observer;
public class CustomerObserver implements Observer{
//訂閱者名字
private String name;
private int version;
public CustomerObserver(String name){
this.name = name;
}
@Override
public void update(int version) {
this.version=version;
System.out.println("該雜誌出新版本了");
this.buy();
}
public void buy(){
System.out.println(name+"購買了第"+version+"期的雜誌!");
}
}
(5)測試類
package observer;
public class Main{
public static void main(String[] args) {
//建立主題(被觀察者)
MagazineSubject magazine = new MagazineSubject();
//建立三個不同的觀察者
CustomerObserver a = new CustomerObserver("A");
CustomerObserver b = new CustomerObserver("B");
CustomerObserver c = new CustomerObserver("C");
//將觀察者註冊到主題中
magazine.addObserver(a);
magazine.addObserver(b);
magazine.addObserver(c);
//更新主題的資料,當資料更新後,會自動通知所有已註冊的觀察者
magazine.publish();
}
}
執行結果
該雜誌出新版本了
A購買了第1期的雜誌!
該雜誌出新版本了
B購買了第1期的雜誌!
該雜誌出新版本了
C購買了第1期的雜誌!