观察者模式:
当对象间存在一对多关系时,一个对象状态发生变化,则会自动通知依赖它的对象,这种模式属于行为模式中的观察者模式。
在Android开发中,常用的事件监听机制就属于观察者模式。常用的例如onClickListener()
与实现View.OnClickListener
这个接口都属于观察者模式的具体实现,称为回调方法。
在Swift等语言中,也可以通过Protocol来实现Java中的Interface功能,但是Swift中最常用的还是Clourse(OC中的Block)来完成Java中的匿名类功能。
回调:
回调方法简单来讲就是当我们改变一个对象的状态时,其会自动响应。响应的前提是该对象本身并没有提供相关的响应方法,而是靠特有的接口来实现的。下面以Android中Button、Activity来简单实现这一场景。
先定义一个接口,该接口定义了抽象方法onClick()
:
public interface OnClickListener {
void onClick();
}
这个接口就是用来响应Button被点击时的逻辑。下面模拟一下Button的内部结构:
public class MyButton {
@SuppressWarnings("unused")
private OnClickListener onClickListener;
private int res;
public MyButton(int res){
this.res = res;
}
public void setOnClickListener(OnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
public void click(){
onClickListener.onClick();
}
}
我们先定义了一个名为MyButton的类,里面存在两个属性,一个为接口的引用,另一个就是Android开发中的 R布局资源文件了。
setOnClickListener()
这个方法是为了注册监听事件,click()
这个方法是我们为了模拟点击这个抽象过程(因为这是控制台程序,不是GUI程序,不能用鼠标点击事件),在这个方法里面就执行了接口引用的抽象方法,也就是响应的动作。
最后来模拟Activity:
public class MainActivity {
private static int R_id_button = 10001;
public static void main(String[] args){
MyButton button = new MyButton(R_id_button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick() {
// TODO Auto-generated method stub
System.out.println("Clicked.");
}
});
button.click();
}
}
这里也不写什么生命周期了,直接在main方法里面实例化MyButton即可。完成实例化后,我们发现下面的写法与Android如出一辙:先是调用button对象的注册监听方法,然后new出了一个匿名类,在里面重写了onClick()
方法,在这个方法里面执行的内容才是我们真正要完成的逻辑。最后,我们手动模拟了点击这个过程。