Java設計模式-回撥函式和觀察者模式
阿新 • • 發佈:2019-01-09
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("回撥函式被呼叫");
}
}
這樣看來,是一致的,區別是觀察者模式裡面目標類維護了所有觀察者的引用,而回調裡面只是維護了一個引用。