Java設計模式-回調函數和觀察者模式

Android的框架中有很是多的地方使用了回調的模式,例如Activity的生命週期,按鈕的點擊事件等。android

下面是回調的基本模型:設計模式

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();只是在點擊事件激發後調用而已。框架

觀察者模式:ide

定義對象間的一對多的依賴關係,當一個對象狀態發生改變時,全部依賴他的對象都獲得通知並被自動更新。函數

目標:this

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);
    }
}.net

觀察者抽象接口設計

public interface Observer {
    public void update();
}
觀察者1server

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("回調函數被調用");     } } 這樣看來,是一致的,區別是觀察者模式裏面目標類維護了全部觀察者的引用,而回調裏面只是維護了一個引用。  

相關文章
相關標籤/搜索