觀察者設計模式:有一個目標類,觀察者對象,當目標對象的狀態有更改的時候,觀察者時時會有相應的通知並作出相應的操做;設計模式
原理:就是在目標對象中耦合觀察者的對象,而且在註冊觀察者對象的時候調用相應操做的方法; 二者之間的關係是單向關聯的;目標類和觀察類之間維護的是鬆耦合的關係;app
在代碼中有須要用到的接口和類有: 觀察者接口 目標接口 和相應的實現類;異步
在觀察者類中維護的方法: 更新方法,當目標類相應方法執行後會執行該更新方法ide
目標類維護的方法和引用:1:維護觀察者的引用, 2:提供增長 刪除 觀察者的方法 3:提供通知觀察者執行update 的方法函數
下面以發短信做爲具體的例子來實現:spa
場景:用戶填寫預定單,當保存用戶預定單成功後須要給這個用戶發送短信,發送短信的過程採用的是異步發送,發完短信後須要將短信發送返回的值和相應的業務數據入庫:這裏將 預定單id 客戶手機號碼,短信發送狀態入庫;設計
具體的代碼實現:日誌
1:維護一個觀察者接口:code
public interface Observe { // 實時監控目標對象的狀態 public void update(int i); }
2:維護一個目標接口:目標接口維護 增長,刪除觀察者,通知觀察者執行update的方法server
public interface Subject { void attach(Observer o); void detach(Observer o); // 通知訂閱者更新消息 void notify(String message); }
3:觀察者的實現類:
public class Appointment implements Observe{ private String appointmentId="1111"; private String phoneNum="2222"; public void saveAppointment(){ // TODO 保存預定單成功 System.out.println("保存預定單成功"); // 發送短信 Message.sendMess(new Appointment()); } @Override public void update(int i) { // 保存發送狀態 業務單據 入庫 System.out.println("返回狀態:"+i+"預定單id:"+appointmentId+"用戶電話:"+phoneNum); }
4:目標實現類:
public class Message implements Subject{ private static List<Observe> observes=new ArrayList<Observe>(); @Override public void attach(Observe o) { // TODO Auto-generated method stub observes.add(o); } @Override public void detach(Observe o) { // TODO Auto-generated method stub observes.remove(o); } @Override public void notify(int i) { // TODO Auto-generated method stub for (Observe observe : observes) { observe.update(i); } } // 具體發送短信的方法 public static void sendMess(Observe o1){ observes.add(o1); // TODO 請求發送短信接口 返回相應的狀態 int i=1; // 發送短信後調用通知方法 Message mess=new Message(); mess.notify(i); }
經過這種方式就實現了當異步發送短信成功後,記錄一條短信發送記錄數據了;
在下篇博客中將介紹經過回調函數的模式來實現短信發送的日誌記錄。