揭开观察者设计模式的神秘面纱,手把手教你写监听器
Posted Mero技术博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了揭开观察者设计模式的神秘面纱,手把手教你写监听器相关的知识,希望对你有一定的参考价值。
我们在写代码的时候,遇到最常用的就是监听器了。那么实际中,我们也要进行事件的监听。而有些事件是业务逻辑需要实现的,跟随事物变化动态变化的。假如说我们要实现一个事件,有位置的监听,有颜色的监听,有坐标的监听,有速度的监听,那么这么多监听的事件。那么我们就需要这么多个监听器。这些监听器如何被管理呢。我们可以创造一个类似管理员身份的神秘角色,这个角色就是一个监听器池,可以移除和增加监听器。当我们触发某一事件的时候,需要这些监听器全部执行监听。
现在我们来模拟一下按钮Button监听器的实现。
新建一个点击事件的接口Clickable.java。只负责执行点击事件。
public interface Clickable {
//点击事件
void onClick();
}
新建一个按钮类MyButton并且实现点击事件接口Clickable,这样就要求我们实现onClick方法。
public class MyButton implements Clickable {
@Override
public void onClick() {
//执行所有监听器里的方法,监听器1,监听器2 ...
}
}
那么此时,监听器又干什么了呢?我们都知道监听器都是接口对象。就相当于一个管理员。点击事件的接口对象就相当于一个事件。而事件的具体内容就通过方法onClick()来体现。
那么既然管理员管理事件,我们先创建管理员(监听器接口),然后管理事物( onClick() )。
监听器接口如下:
public interface OnClickListener {
void onClick(Clickable clickable);
}
与此同时,我们需要增加监听器,写一个设置监听器的方法。对这个接口进行回调。
public void setOnClickListener(OnClickListener onClickListener){
if(onClickListener!=null){
onClickListener.onClick(this);
}
}
这样的话,当我们设置监听的时候,从外部引入的OnClickListener接口对象不为空,就会执行OnClickListener接口中的onClick()方法。
接下来,我们可以实现这个监听器接口用来作为得到OnClickListener接口对象的方式。这个地方可能比较难理解。我们应该知道,如果一个类实现了某个接口,通过实例化这个类对象而得到相应的接口对象。
下面我们来新建一个颜色监听器。如果颜色改变,这里我默认为true。实际上这里可以进行颜色的判断。当发生变化的时候,我们需要向外界暴露一个方法,供外界调用,所以我们在类里面再新建一个抽象方法。当外部匿名构造这个类对象的时候同时也会实现这个类的方法。
public static abstract class OnColorListener implements OnClickListener{
@Override
public void onClick(Clickable clickable) {
if(true){
colorChanged();
}
}
public abstract void colorChanged();
}
接下来我们再新建一个位置监听器。同样和上面一样,代码如下:
public static abstract class OnCoordinateListener implements OnClickListener{
@Override
public void onClick(Clickable clickable) {
if(true){
coordinateChanged();
}
}
public abstract void coordinateChanged();
}
再接下来我们需要一个焦点监听器。同上,
public static abstract class OnFocusListener implements OnClickListener{
@Override
public void onClick(Clickable clickable) {
if(true){
onFocusChanged();
}
}
public abstract void onFocusChanged();
}
这三个类实现了OnClickListener接口,那么我们只要匿名构造这三个对象便可以得到OnClickListener接口对象。同时也实现了OnclickListener里面的接口方法。在这个方法里面,我们分别进行了相应监听目的的变化监听。当某某发生改变的时候,我们就向外界提供一个方法,供调用者去实现。所以把这个类改成了抽象类,同时提供了抽象方法。外界如何调用的呢。我们可以看到setOnClickListener方法
public void setOnClickListener(OnClickListener onClickListener){
if(onClickListener!=null){
onClickListener.onClick(this);
}
}
我们看到这里,我们便知道,传进来的OnClicklistener接口对象可以由它具体的实现类的匿名对象得到,也可以由它自身的接口对象得到。所以传进来的参数可以是以下几种
- OnClickListener
- FocusListener
- OnCoordinateListener
- OnColorListener
以上是关于揭开观察者设计模式的神秘面纱,手把手教你写监听器的主要内容,如果未能解决你的问题,请参考以下文章
揭开华为云CodeArts TestPlan启发式测试设计神秘面纱!