spring基礎01-簡介,安裝
阿新 • • 發佈:2022-03-17
有兩組實體物件,一組是觀察者,一組是被觀察者。Concretesubject是被觀察者,ConcreteObserver是觀察者。所有的觀察者,都實現了Observer介面;所有的被觀察者,都繼承自Subject抽象類。
聽著有點懵逼,直接上程式碼
定義一個觀察者介面
//觀察者
public interface Observer {
public void update();
}
定義被觀察者抽象類
//被觀察者 abstract class Subject { //內部維護的一個觀察者列表 private List<Observer> observerList = new ArrayList<Observer>(); //新增觀察者 public void attachObserver(Observer observer) { observerList.add(observer); } //移除觀察者 public void detachObserver(Observer observer) { observerList.remove(observer); } //通知觀察者 public void notifyObservers() { for (Observer observer : observerList) { observer.update(); } } }
怪物、寶物、陷阱觀察者
//怪物觀察者 public class Monster implements Observer { @Override public void update() { if (inRange()) { System.out.println("怪物對主角進行攻擊!"); } } private boolean inRange() { //判斷主角是否在自己的影響範圍內,這裡忽略細節,直接返回true return true; } } //陷阱觀察者 public class Trap implements Observer { @Override public void update() { if (inRange()) { System.out.println("陷阱 困住主角!"); } } private boolean inRange() { // 判斷主角是否在自己的影響範圍內,這裡忽略細節,直接返回true return true; } } //寶物觀察者 public class Treasure implements Observer { @Override public void update() { if (inRange()) { System.out.println("寶物 為主角加血!"); } } private boolean inRange() { // 判斷主角是否在自己的影響範圍內,這裡忽略細節,直接返回true return true; } }
每一個觀察者都實現了自己不同的update方法。分別對觀察者有不同的處理方法。
建立主角類,他是被觀察的物件,主教類做出操作,這時候就呼叫notifyObServers()方法來進行通知觀察者,觀察者分別呼叫自己的update()方法。
//被觀察者
public class Hero extends Subject{
void move() {
System.out.println("主角向前移動");
//觸發操作,遍歷通知觀察者
notifyObservers();
}
}
以下是測試類
public static void main(String[] args) { //初始化物件 Hero hero = new Hero(); Monster monster = new Monster(); Trap trap = new Trap(); Treasure treasure = new Treasure(); //註冊觀察者 hero.attachObserver(monster); hero.attachObserver(trap); hero.attachObserver(treasure); //移動事件 hero.move(); } }
結果:
主角向前移動
怪物對主角進行攻擊!
陷阱 困住主角!
寶物 為主角加血!
我們可以看到只要hero觸發move,其他觀察者物件都做出了反應。
什麼時候用觀察者模式呢?
當一個物件的改變需要同時改變其它物件,並且它不知道具體有多少物件有待改變的時候,應該考慮使用觀察者模式。
而使用觀察者模式的動機在於:將一個系統分割成一系列相互協作的類有一個很不好的副作用,就是需要維護相關物件間的一致性,我們不希望為了維持一致性而使各類緊密耦合,這樣會給維護、擴充套件和重用都帶來不便,而觀察者模式所做的工作就是在解除耦合。
應用例項:
- 手機丟了,委託別人給其他人發訊息通知
- 通知老師/老闆來了
- 拍賣,拍賣師觀察最高標價,然後通知給其它競價者競價
- 在一個目錄下建立一個檔案,會同時通知目錄管理器增加目錄,並通知磁碟減少空間,檔案是被觀察者,目錄管理器和磁碟管理器是觀察者
- 貓叫了一聲,嚇著了老鼠,也驚到了主人,貓是被觀察者,老鼠和人是觀察者。
注意事項:
- 避免迴圈引用
- 如果順序執行,某一觀察者錯誤會導致系統卡殼,一般採用非同步方式。