1. 問題背景
假設我們有一個 銀行賬戶管理系統,該系統需要監控用戶賬戶余額的變動,并在發生變動時,自動執行一些相關的操作,比如發送 余額變動通知(如短信、郵件等)。為了實現這一功能,我們希望通過一個靈活且松耦合的方式來處理余額變動通知。
2. 監聽器
這個問題當中,當用戶的余額發生變化的一瞬間,我們就希望執行發送短信、郵件等功能,在不不知道監聽器的時候,你也許會直接在用戶余額發生變化的時候把相應的業務邏輯寫在那里,這樣有好處但是也有壞處,好處就是代碼邏輯性強,壞處就是高耦合且不好維護
所以想到余額變化的時候代碼那個地方只調用有一個接口,真正執行的時候再把實現注入進去,這個就是監聽器
3. 手搓代碼環節
3.1 項目結構
3.2?AccountBalanceListener
public?interface?AccountBalanceListener?{void?onBalanceChange(double?newBalance);??//?余額變化時的響應方法?可以設置發短信或者郵件
}
3.3?BalanceChangeNotifier
public?class?BalanceChangeNotifier?implements?AccountBalanceListener{@Overridepublic?void?onBalanceChange(double?newBalance)?{//?假設發送一條通知(如發送短信或電子郵件)System.out.println("發送郵件?新的余額是:"?+?newBalance);}
}
3.4?BankAccount
public?class?BankAccount?{private?double?balance;??//?賬戶余額private?AccountBalanceListener?listener;??//?持有監聽器的引用//?構造方法public?BankAccount(double?balance)?{this.balance?=?balance;}//?設置余額監聽器public?void?setListener(AccountBalanceListener?listener)?{this.listener?=?listener;}//?修改余額public?void?changeBalance(double?amount)?{this.balance?+=?amount;??//?更新余額if?(listener?!=?null)?{listener.onBalanceChange(this.balance);??//?觸發余額變化事件}}//?獲取當前余額public?double?getBalance()?{return?balance;}
}
3.5 Main
public?class?Main?{public?static?void?main(String[]?args)?{//?創建銀行賬戶對象BankAccount?account?=?new?BankAccount(1000.0);//?創建余額變動通知器BalanceChangeNotifier?notifier?=?new?BalanceChangeNotifier();//?設置賬戶的余額監聽器account.setListener(notifier);//?模擬賬戶余額變動account.changeBalance(-200.0);account.changeBalance(500.0);}
}
4. 總結
4.1 運行截圖
4.2 一些心得
監聽器和觀察者有點像,但還是有不同的
-
監聽器是狀態發生變化立刻就執行業務邏輯,觀察者則是狀態發生變化只是通知各個訂閱者,狀態發生變化了,業務邏輯還需要他們自己去執行
-
監聽器往往是1對1,觀察者則是1對多 監聽器往往用于ui相關,比如按鈕的單擊事件,觀察者更多的是偏向于業務邏輯相關