从按钮点击学观察者模式
Created by miccall (转载请注明出处)
- 本文将从 android 和 unity 两个方面,用 java 和 c# 讲解观察者模式
按钮点击
-
刚学安卓的时候 ,按钮点击是必不可少的 ,我们先来回顾一下其中的套路
-
相信大家对此都不陌生了
-
如果你连这个都没有写的很熟练 ,那此篇文章可能不适合你了
//寻找控件
Button bt = (Button) findViewById(R.id.bt);
//实例化一个监听
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
//点击事件
//your code
}
};
//为按钮控件设置点击监听
bt.setOnClickListener(clickListener );
-
当然这样做的目的是为了更好的理解观察者模式
-
在这里 我们称 Button 为 被观察者 ( Observable )
-
这个单词还是很重要的 RxJava 里面还会用到
-
当然可想而知 OnClickListener 就是观察者 ( Observer ) 了
-
被观察者可以有多个观察者 这个叫做订阅机制 (Subscribe)
-
当被观察者的状态发生改变 观察者就做出相应的动作
-
这个就叫做 观察者模式
自定义一个按钮
-
我们可以设想一下 这里的按钮有哪些功能
-
除了基本的点击 我们看到了 还有一个 setOnClickListener 方法
-
分析一下这个方法 他传入一个 Listener 这个listener 是我们刚刚new的
-
根据写法 我们应该确定他是一个inteface 才对
-
我们新建一个文件 ViewButton 他是一个 interface
-
我们给他一个 未实现的方法
interface ViewButton {
void setListener(MyListener ls);
}
-
这个方法要有一个 MyListener
-
新建一个文件 命名 MyListener 他也是一个interface
-
先不管他 我们还是写这个按钮类
-
然后我们写一个按钮的类 来实现这个接口
-
为了方便调用 也为了实现功能 我们要一个全局变量 这个变量就是一个 观察者
-
但是观察者不止一个 我们要用一个list去存放
-
但是这里为了方便理解 我们不这样介绍 还是存放单个的观察者
-
新建一个文件 命名myButton 他是一个class
-
他要实现我们刚刚的 被观察者的接口
public class myButton implements ViewButton{
MyListener currentLS ;
@Override
public void setListener(MyListener ls) {
currentLS = ls;
}
-
回过头来再来看 MyListener
-
他是一个接口 我们在new他的时候 他会有一个onclik类要去实现
-
我们就把他写出来
interface MyListener {
void onClick(ViewButton vb);
}
-
写完这些 感觉上基本架构都打好了
-
我们试着模仿我们熟悉的代码去写
-
来到主文件 首先是按钮 也就是被观察者
-
在这里不是findviewbyid了 我们直接new 他
myButton bt1 = new myButton();
-
他会实例化一个bt1 这个就是具体的 被观察者 了
-
然后就是观察者 他是一个接口
MyListener myListener = new MyListener() {
@Override
public void onClick(ViewButton vb) {
}
};
-
下一步,就是监听了
-
还是熟悉的写法
bt1.setListener(myListener);
-
这样,好像就完成了我们所需要的模型了
-
但是这个怎么模拟运行呢
-
我们在myButton类中 添加一个模拟方法
void click(){
Log.d("miccall","startClick");
currentLS.onClick(this);
}
-
还记的 currentLS 吗 就是我们刚刚传入的myListener
-
他通过myButton 的 setListener方法存入类的成员变量中
-
然后现在归我们所用
-
我们通过他调用他的onClick方法 并把this传入过去
-
为什么要传this ? 自己理解一下
-
this代表了当前类的对象 我们要使Listener工作 就得让他知道
-
是哪一个对象 调用了他的方法
-
然后我们在主文件中 在订阅了Listener之后
//事件模拟
bt1.click();
-
这样 我们就模拟了一次点击
-
接着我们来分析一下这个过程
自定按钮过程分析
-
首先 肯定是调用 bt1 的 click() 方法
-
这个方法做了两件事 一个是输出一个log
-
另一个就是调用 currentLS 的 onClick(this) 方法
-
currentLS是什么 再说一次 他是 bt1.setListener(myListener)
-
的时候 传入的 myListener 然后 一句currentLS = ls
-
他就代表了 bt1 这个被观察者 的 一个 观察者对象
-
然后是 currentLS.onClick(this) 方法 this代表什么 ?
-
this就代表 bt1 本身
-
再来看 onClick(this)方法 他是 interface MyListener 的一个未实现的方法
-
那在哪里实现的呢 ?
-
当然是我们自己实现的呀
MyListener myListener = new MyListener() {
@Override
public void onClick(ViewButton vb) {
Log.d("miccall","Click_end");
}
};
-
为了测试 我们再加入一个log
-
这样是不是就绕回来呢?
-
我们自己设置的bt
-
当触发一个事件
-
又执行了一个自己定义的事件
-
整个联系起来 就形成了一个 观察者模式
-
这里给留一个问题 为什么 setListener() 写成了ViewButton的一个未实现方法?
-
可不可以直接写为myButton类的成员方法 ?
unity中的观察者模式
- 待更新
网友评论