先看一下類圖:
具體實現:
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); } }