Java設計模式-回撥函式和觀察者模式
Android的框架中有非常多的地方使用了回撥的模式,例如Activity的生命週期,按鈕的點選事件等。
下面是回撥的基本模型:
- public class A {
- private CallBack callback;
- //註冊一個事件
- public void register(CallBack callback){
- this.callback = callback;
- }
- // 需要呼叫的時候回撥
- public void call(){
- callback.oncall();
- }
- }
- public interface CallBack {
- public void oncall();
- }
- public static void main(String[] args) {
- A a = new A();
- a.register(new CallBack() {
- @Override
- public void oncall() {
- System.out.println("回撥函式被呼叫");
- }
- });
- a.call();
- }
如果把類A改成Button,CallBack改成OnClickListener,register函式改成setOnclickListener,和android裡面設定點選事件是一樣的。callback.oncall();只是在點選事件激發後呼叫而已。
觀察者模式:
定義物件間的一對多的依賴關係,當一個物件狀態發生改變時,所有依賴他的物件都得到通知並被自動更新。
目標:
- public class Subject {
- List<Observer> lists = new ArrayList<Observer>();
- //註冊一個事件
- public void register(Observer observer){
- lists.add(observer);
- }
- public void _notify(){
- for (Observer observer : lists) {
- observer.update();
- }
- }
- public void unRegister(Observer observer){
- lists.remove(observer);
- }
- }
觀察者抽象介面
- public interface Observer {
- public void update();
- }
觀察者1
- public class ConcreteObserver1 implements Observer{
- public void update() {
- System.out.println("ConcreteObserver1獲得更新");
- }
- }
觀察者2
- public class ConcreteObserver2 implements Observer{
- public void update() {
- System.out.println("ConcreteObserver2獲得更新");
- }
- }
- public static void main(String[] args) {
- Observer observer1 = new ConcreteObserver1();
- Observer observer2 = new ConcreteObserver2();
- Subject subject = new Subject();
- subject.register(observer1);
- subject.register(observer2);
- subject._notify();
- //取消觀察者1的註冊
- subject.unRegister(observer1);
- subject._notify();
- }
目標物件儲存了各個觀察者的引用,當需要通知時傳送通知。
實際上,回撥是觀察者模式的簡單形式。觀察者模式也就是將回撥上升到設計模式的理論高度上了而已。
將回撥例子中的main方法改成
- public static void main(String[] args) {
- CallBack callback = new CallBackImp();
- A a = new A();
- a.register(callback);
- a.call();
- }
增加CallBack的實現類CallBackImp
- public class CallBackImp implements CallBack{
- @Override
- public void oncall() {
- System.out.println("回撥函式被呼叫");
- }
- }
這樣看來,是一致的,區別是觀察者模式裡面目標類維護了所有觀察者的引用,而回撥裡面只是維護了一個引用。
原文地址:http://blog.csdn.net/cauchyweierstrass/article/details/44593807
相關文章
- 觀察者模式在One Order回撥函式中的應用模式函式
- Java設計模式-觀察者模式Java設計模式
- 設計模式:回撥模式設計模式
- Java 設計模式之《觀察者模式》Java設計模式
- Java設計模式之觀察者模式Java設計模式
- Java設計模式10:觀察者模式Java設計模式
- C++屌屌的觀察者模式-同步回撥和非同步回撥C++模式非同步
- Java設計模式之(十二)——觀察者模式Java設計模式
- Java常用設計模式之觀察者模式Java設計模式
- 我的Java設計模式-觀察者模式Java設計模式
- 淺識JAVA設計模式——觀察者模式Java設計模式
- java設計模式之觀察者模式(9)Java設計模式
- 設計模式----觀察者模式設計模式
- 設計模式 —— 觀察者模式設計模式
- 設計模式(觀察者模式)設計模式
- 設計模式——觀察者模式設計模式
- 設計模式-觀察者模式設計模式
- 設計模式_觀察者模式設計模式
- 【設計模式】觀察者模式設計模式
- 使用函式式實現觀察者模式模式函式模式
- 折騰Java設計模式之觀察者模式Java設計模式
- Java中的設計模式(一):觀察者模式Java設計模式
- 17.java設計模式之觀察者模式Java設計模式
- 當觀察者模式和回撥機制遇上Android原始碼模式Android原始碼
- 設計模式(十六)觀察者模式設計模式
- PHP設計模式-觀察者模式PHP設計模式
- 設計模式(9) 觀察者模式設計模式
- 設計模式-觀察者模式上設計模式
- 設計模式-觀察者模式下設計模式
- 設計模式解析:觀察者模式設計模式
- JS設計模式(觀察者模式)JS設計模式
- 設計模式之觀察者模式設計模式
- 設計模式 #6 (觀察者模式)設計模式
- 設計模式之-觀察者模式設計模式
- 設計模式之【觀察者模式】設計模式
- javascript設計模式觀察者模式JavaScript設計模式
- 設計模式:觀察者模式(observer)設計模式Server
- Java進階篇設計模式之十三 ---- 觀察者模式和空物件模式Java設計模式物件