第0章:簡介
觀察者模式定義:定義對象間的一種一對多的依賴關係。當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新
觀察者模式本質:觸發聯動
參考:http://chjavach.iteye.com/blog/1632211,研磨設計模式(書籍),大話設計模式(書籍)
模式圖:
待補充
第1章:實踐
第0節:觀察者模式(拉模式)
(1)目標對象,被觀察者(Target.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; import java.util.ArrayList; import java.util.List; /** * 目標對象,被觀察者 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:32 */ public class Target { //持有所有註冊的觀察者對象 private List<Observer> observerList = new ArrayList<Observer>(); //增加觀察者對象 public void addObserver(Observer observer){ observerList.add(observer); } //移除觀察者對象 public void removeObserver(Observer observer){ observerList.remove(observer); } /** * 通知所有註冊的觀察者對象 */ protected void notifyObservers(){ for(Observer observer : observerList){ observer.update(this); } } } |
(2)目標對象子類(TargetExtends.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 目標對象子類,被觀察者,管理狀態變化 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:43 */ public class TargetExtends extends Target { //目標對象狀態 private String targetState; public String getTargetState() { return targetState; } public void setTargetState(String targetState) { this.targetState = targetState; //狀態發生了變化,通知各觀察者對象 this.notifyObservers(); } } |
(3)觀察者接口(Observer.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 觀察者接口,拉模型,主動權爲觀察者,被觀察者負責通知狀態改變 * * 觀察者模式的定義:定義對象間的一種一對多的依賴關係。當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新 * 觀察者模式的本質:觸發聯動 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:35 */ public interface Observer { /** * 目標對象,更新觀察結果,可加入其它操作 * @param target */ public void update(Target target); } |
(4)觀察者A(ObserverImplA.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 觀察者A * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:48 */ public class ObserverImplA implements Observer { /** * 拉模型,觀察者感應到目標對象發生變化,消息必須自己去獲取 * @param target */ @Override public void update(Target target) { System.out.println("觀察者A收到目標狀態信息:" +((TargetExtends)target).getTargetState()+ ",執行相應操作"); } } |
(5)觀察者B(ObserverImplB.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 觀察者B * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:58 */ public class ObserverImplB implements Observer { /** * 拉模型,觀察者感應到目標對象發生變化,消息必須自己去獲取 * @param target */ @Override public void update(Target target) { System.out.println("觀察者B收到目標狀態信息:" +((TargetExtends)target).getTargetState()+ ",執行相應操作"); } } |
(6)客戶端測試(Client.java)
package com.mcc.core.designPattern.behavior.observer.dragObserver; /** * 客戶端測試 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:58 */ public class Client { public static void main(String args[]){ //目標對象,被觀察者 TargetExtends target = new TargetExtends(); //觀察者 Observer observerA = new ObserverImplA(); Observer observerB = new ObserverImplB(); //註冊觀察者 target.addObserver(observerA); target.addObserver(observerB); //被觀察者更新狀態 target.setTargetState("【已經發布,請查收】"); } } |
第1節:觀察者模式(推模式)
(1)目標對象,被觀察者(Target.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; import java.util.ArrayList; import java.util.List; /** * 目標對象,被觀察者 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:32 */ public class Target { //持有所有註冊的觀察者對象 private List<Observer> observerList = new ArrayList<Observer>(); //增加觀察者對象 public void addObserver(Observer observer){ observerList.add(observer); } //移除觀察者對象 public void removeObserver(Observer observer){ observerList.remove(observer); } /** * 通知所有註冊的觀察者對象 */ protected void notifyObservers(String message){ for(Observer observer : observerList){ observer.update(message); } } } |
(2)目標對象子類(TargetExtends.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 目標對象子類,被觀察者,管理狀態變化 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:43 */ public class TargetExtends extends Target { //消息 private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; //通知並推送消息給觀察者 this.notifyObservers(message); } } |
(3)觀察者接口(Observer.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 觀察者接口,推模型,主動權爲目標對象 * * 觀察者模式的定義: * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:35 */ public interface Observer { /** * 目標對象,更新觀察結果,可加入其它操作 * @param message 推送的消息 */ public void update(String message); } |
(4)觀察者A(ObserverImplA.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 觀察者A * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:48 */ public class ObserverImplA implements Observer { /** * 推模型,消息直接被目標對象推送過來 * @param message */ @Override public void update(String message) { System.out.println("觀察者A收到推送過來的消息:" + message + ",執行相應操作"); } } |
(5)觀察者B(ObserverImplB.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 觀察者B * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:58 */ public class ObserverImplB implements Observer { /** * 推模型,消息直接被目標對象推送過來 * @param message */ @Override public void update(String message) { System.out.println("觀察者B收到推送過來的消息:" + message + ",執行相應操作"); } } |
(6)客戶端測試(Client.java)
package com.mcc.core.designPattern.behavior.observer.pushObserver; /** * 客戶端測試 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午3:58 */ public class Client { public static void main(String args[]){ //目標對象,被觀察者 TargetExtends target = new TargetExtends(); //觀察者 Observer observerA = new ObserverImplA(); Observer observerB = new ObserverImplB(); //註冊觀察者 target.addObserver(observerA); target.addObserver(observerB); //推送消息 target.setMessage("【消息:今天會議取消】"); } } |
第2節:觀察者模式(java自帶)
(1)目標對象(Targeter.java)
package com.mcc.core.designPattern.behavior.observer.javaObserver; import java.util.Observable; /** * 目標對象,java方式實現 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午4:23 */ public class Targeter extends Observable { //消息 private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; //設置狀態,java自帶實現 this.setChanged(); //主動通知觀察者,java自帶實現,推方式 this.notifyObservers(this.message); // //主動通知觀察者,java自帶實現,拉方式 // this.notifyObservers(); } } |
(2)觀察者A(ObserverA.java)
package com.mcc.core.designPattern.behavior.observer.javaObserver; import java.util.Observable; import java.util.Observer; /** * 觀察者A,java實現方式 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午4:29 */ public class ObserverA implements Observer { /** * 處理更新 * @param o * @param arg */ @Override public void update(Observable o, Object arg) { //推方式需要在目標對象中調用notifyObservers帶參數的方法,否則這裏的org會是null System.out.println("觀察者A收到推送過來的消息:" + arg + ",執行相應操作"); //拉方式是默認的模型,目標對象中調用有參數或無參數的notifyObservers都可以 System.out.println("觀察者A拉到消息:" + ((Targeter)o).getMessage() + ",執行相應操作"); } } |
(3)觀察者B(ObserverB.java)
package com.mcc.core.designPattern.behavior.observer.javaObserver; import java.util.Observable; import java.util.Observer; /** * 觀察者B,java實現方式 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午4:44 */ public class ObserverB implements Observer { /** * 處理更新 * @param o * @param arg */ @Override public void update(Observable o, Object arg) { //推方式需要在目標對象中調用notifyObservers帶參數的方法,否則這裏的org會是null System.out.println("觀察者B收到推送過來的消息:" + arg + ",執行相應操作"); //拉方式是默認的模型,目標對象中調用有參數或無參數的notifyObservers都可以 System.out.println("觀察者B拉到消息:" + ((Targeter)o).getMessage() + ",執行相應操作"); } } |
(4)客戶端測試(Client.java)
package com.mcc.core.designPattern.behavior.observer.javaObserver; /** * 客戶端測試 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-15 下午4:45 */ public class Client { public static void main(String args[]){ //目標對象,被觀察者 Targeter targeter = new Targeter(); //觀察者 ObserverA observerA = new ObserverA(); ObserverB observerB = new ObserverB(); //註冊觀察者 targeter.addObserver(observerA); targeter.addObserver(observerB); //推送消息 targeter.setMessage("【消息:今天會議取消】"); } } |