觀察者模式的定義是: 定義對象中的一種 一對多的關係依賴關係, 以便當一個對象的狀態改變的時候,全部依賴他的對象都能獲得通知而且刷新java
觀察者模式是一種很是常見的設計模式,應該範圍很是廣, 就本人作遊戲來講 ,用到的位置很是多設計模式
舉一個遊戲中的例子,玩家的血量這一個屬性, 當玩家血量減小時候,玩家的頭像處血量須要獲得通知而且刷新血量, 假如人物掉血須要出現數字掉血的效果,那麼 此對象也須要知道人物掉血的狀態,人物血量降低到必定的百分比,觸發某種特殊效果,此時此對象也須要獲得人物血量減小的通知;多線程
觀察者模式是一種發佈訂閱模式, 就是 觀察者對象 同時向被觀察者對象訂閱了某種服務i, 當被觀察者 狀態發生改變的時候, 通知觀察者 刷新狀態;ide
代碼以下:學習
package test.client; import java.util.ArrayList; import java.util.List; public class ObserverTest { //使用場景 public static void main(String[] args){ FlyHpObserver objOne = new FlyHpObserver(); HeadHpObserver objTwo = new HeadHpObserver(); HpStateObserver objThree = new HpStateObserver(); HpAttribute subject = new HpAttribute(); subject.addObserver(objOne); subject.addObserver(objTwo); subject.addObserver(objThree); subject.setW_HpValue(100); } } interface IObserver { public void update(int hp); } class FlyHpObserver implements IObserver{ @Override public void update(int hp) { System.out.println("fly hp bar and the current hp is " + hp); } } class HeadHpObserver implements IObserver{ @Override public void update(int hp) { System.out.println("head hp changed and the current hp is " + hp); } } class HpStateObserver implements IObserver{ @Override public void update(int hp) { System.out.println("hp changed and the current hp is " + hp); } } interface ISubject { public void addObserver(IObserver obj); public void removeObserver(IObserver obj); public void notifyAllObserver(); } class HpAttribute implements ISubject{ private int w_HpValue; private List<IObserver> w_ObserverList = new ArrayList<IObserver>(); public int getW_HpValue() { return w_HpValue; } public void setW_HpValue(int w_HpValue) { this.w_HpValue = w_HpValue; notifyAllObserver(); //當玩家血量改變的時候通知觀察者刷新數據 } @Override public void addObserver(IObserver obj) { // TODO Auto-generated method stub w_ObserverList.add(obj); } @Override public void removeObserver(IObserver obj) { // TODO Auto-generated method stub w_ObserverList.remove(obj); } @Override public void notifyAllObserver() { int size = w_ObserverList.size(); for(int i = 0 ; i < size ; i++){ w_ObserverList.get(i).update(w_HpValue); } } }
輸出結果以下:this
fly hp bar and the current hp is 100
head hp changed and the current hp is 100
hp changed and the current hp is 100spa
因爲觀察者模式跟他的名字同樣直觀簡單, 因此 也不打算多說了線程
我寫的東西都沒有考慮多線程環境的問題(好比 在 notifyAllObserver方法調用的時候 , w_ObserverList的值可能被其餘現成更改)設計
關於 多線程環境的學習 打算 單獨進行code
此致 敬禮
選擇 程序 就是選擇了 不斷學習 不斷進步 加油 = =