Android学习按键事件监听与Command模式 - Dufresne - 博客园
?
一 Command模式
意图:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;
对请求排队或记录请求日志,以及支持可撤销的操作。
将请求被封装成一个对象,当向某对象提交请求时,使我们可以不用去知道被具体的请求的操作或者请求的接收者,
实现了动作的请求者对象和动作的执行者对象之间的解耦合。
适用性:
- 使用Command模式代替callback形式的回调应用;
- 在不同的时刻指定、排列和执行请求,动态的更改请求;
- 支持取消操作;
- 支持修改日志,保存请求执行过程以便恢复操作;
- Command模式支持一组事务的调用操作。且易于增加扩展新事务;?
(何为事务参考:http://book.51cto.com/art/201202/319377.htm)
结构:
??????
说明:
Command:命令的封装者,声明命令执行的操作接口;
ConcreteCommand:使命令的具体接收者执行相应的动作;
Invoke:发出执行该命令的请求,存储具体命令执行者的抽象父类;
Receiver:实施与执行具体相关请求的具体操作,由命令对象创建者指定;
?
通过此图可以到此模式的核心:实现操作对象的调用Invoke与具体实施该操作的对象Receiver之间解耦,
是通过增加Command,将动作执行委托给Command来执行调用真正的动作执行者。
?
二 Android中OnClickListener
在View类中:
public interface OnClickListener {
void onClick(View v);
}
作用:Interface definition for a callback to be invoked when a view is clicked.
就是一个click事件的回调接口。
在需要响应click事件的View中,都需要注册一个相应的ClickListener来监听click事件发生时被调用。
看一下面这段代码:Button控件
public class MyActivity extends Activity { protected void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.content_layout_id); final Button button = (Button) findViewById(R.id.button_id); //注册click事件监听器 button.setOnClickListener(new View.BtnOnClickListener()); } private class BtnOnClickListener extends OnClickListener{ public void onClick(View v) { // Perform action on click } } }?
看一下相应的这个结构:?
?
这里面View就是Invoke,OnClickListener就是Command,MyActivity就是Receiver。
执行过程如下:
?
可以看到这种方式的应用属于:
Command模式替换Callback函数形式的回调模型,让框架结构变得更清晰更灵活。