觀察者模式(有時又被稱爲發佈(publish )-訂閱(Subscribe)模式、模型-視圖(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟件設計模式的一種。在此種模式中,==一個目標物件管理全部相依於它的觀察者物件,而且在它自己的狀態改變時主動發出通知==。這一般透過呼叫各觀察者所提供的方法來實現。此種模式一般被用來實現事件處理系統。java
季度分享差很少落幕,你們滿心期待大波的審批結果,沒人內心無時無刻不想去大波那裏問一下結果如何,可是這樣大波內心叫苦,每時每刻都有人來騷擾,不勝其煩,因此,觀察者模式出場設計模式
package com.jack.idea.test.designmode;
import java.util.ArrayList;
import java.util.List;
/**
* 觀察者模式
*
* @author ljs.song
* @date 2018-01-02 10:40
*/
public class ObserverClient {
public static void main(String[] args) {
//大boss大波出場
DaboSubject daboSubject = new DaboSubject();
//小杰向大boss代表想第一時間知道結果
XiaoJieObserver xiaoJieObserver = new XiaoJieObserver();
daboSubject.registerObserver(xiaoJieObserver);
//小臣也想知道結果
XiaoChenObserver xiaoChenObserver = new XiaoChenObserver();
daboSubject.registerObserver(xiaoChenObserver);
//小龍表示我也想知道
XiaoLongObserver xiaoLongObserver = new XiaoLongObserver();
daboSubject.registerObserver(xiaoLongObserver);
//大波進行一次初步評審變更
daboSubject.notifyAllObserver("你們好我初步作了評審,請查看是否有疑問");
System.out.println("--------------------------");
//小龍以爲有疑問,告訴了大波,大波從新修改了小龍的評審結果
daboSubject.notifyObserver(2,"我給你改了,再看下有沒有問題");
}
}
/**
* 被觀察者,主題
*/
abstract class Subject{
protected List<Observer> observers = new ArrayList<>();
void registerObserver(Observer observer){
if(observer != null && !observers.contains(observer)){
observers.add(observer);
}
}
void removeObserver(Observer observer){
if(observer != null && observers.contains(observer)){
observers.remove(observer);
}
}
/**
* 通知所有觀察者
*/
abstract void notifyAllObserver(String messages);
/**
* 通知指定觀察者
* @param i
* @param message
*/
abstract void notifyObserver(int i,String message);
}
/**
* 觀察者
*/
interface Observer{
void update(String message);
}
/**
* 大波,真正的被觀察者
*/
class DaboSubject extends Subject {
/**
* 狀態變化後通知各個觀察者
*/
@Override
public void notifyAllObserver(String message) {
for (Observer observer1 : this.observers) {
observer1.update(message);
}
}
@Override
void notifyObserver(int i,String message) {
observers.get(i).update(message);
}
}
/**
* 小杰接受被觀察者的信息
*/
class XiaoJieObserver implements Observer{
@Override
public void update(String message) {
System.out.println("小杰收到通知:" + message);
}
}
/**
* 小臣等待被觀察者的信息
*/
class XiaoChenObserver implements Observer{
@Override
public void update(String message) {
System.out.println("小辰收到通知:" + message);
}
}
/**
* 小龍等待信息公佈
*/
class XiaoLongObserver implements Observer{
@Override
public void update(String message) {
System.out.println("小龍收到通知:" + message);
}
}複製代碼
轉載請註明出處 阿布的夏天ide