標籤:觀察者模式
先看一下類圖:
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/8A/91/wKiom1g0DT2gbhQIAAFoaSDIwVg867.png-wh_500x0-wm_3-wmp_4-s_2935860678.png" title="observer-design.png" width="600" height="387" border="0" hspace="0" vspace="0" style="width:600px;height:387px;" alt="wKiom1g0DT2gbhQIAAFoaSDIwVg867.png-wh_50" />
具體實現:
package obs.self;/** * 被觀察對象 * @author wangfeihu * */public interface Subject { /** * 增加一個觀察者 * @param observer */ public void addObserver(Observer observer); public void removeObserver(Observer observer); /** * 通知所有觀察者 * @param msg */ public void notifyObservers(Object msg); }
package obs.self;/** * 觀察者 * @author wangfeihu * */public interface Observer { public void update(Object msg);}
package obs.self;import java.util.HashSet;import java.util.Set;/** * 銀行賬戶, 餘額發生變化的時候進行相關的通知 * @author wangfeihu * */public class Account implements Subject { private int balance = 0; public Set<Observer> obervers = new HashSet<Observer>(); public void addObserver(Observer observer) { obervers.add(observer); } public void removeObserver(Observer observer) { obervers.remove(observer); } public void notifyObservers(Object msg) { for (Observer obs : obervers) { obs.update(msg); } } public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; this.notifyObservers("賬戶餘額發生改變," + balance); } /** * 取款 * @param money */ public void withdraw(int money) { this.setBalance(this.balance - money); } /** * 存款 * @param money */ public void deposit(int money) { this.setBalance(this.balance + money); }}
package obs.self;public class MobileObserver implements Observer { public void update(Object msg) { System.out.println("手機簡訊提醒:" + msg); }}
package obs.self;public class WechatObserver implements Observer { public void update(Object msg) { System.out.println("服務號提醒:" + msg); }}
執行:
package obs.self;public class ObserverTest { public static void main(String[] args) { Account accountSubject = new Account(); MobileObserver mobileObserver = new MobileObserver(); WechatObserver wechatObserver = new WechatObserver(); accountSubject.addObserver(mobileObserver); accountSubject.addObserver(wechatObserver); // 存錢 accountSubject.deposit(10000); // 取錢 accountSubject.withdraw(500); //移除簡訊通知 accountSubject.removeObserver(mobileObserver); accountSubject.withdraw(600); }}
本文出自 “流浪的腳步” 部落格,請務必保留此出處http://now51jq.blog.51cto.com/3474143/1875450
朝花夕拾--觀察者模式-java筆記