您的位置:首页 > 移动开发 > Android开发

Java设计模式之Command在Android中的应用

2015-11-01 03:10 471 查看
1.概念:其实刚开始我也不是很理解这一模式。后面看到一些文章谈到Command模式的许多代码都是针对图形界面,它实际就是菜单命令。把这句话照搬到Android中,会发现我们经常做的一些如对点击事件的监听就是采用的这种模式:把对控件和对控件的事件处理分离开来,降低耦合性。它和适配器模式非常相似,只不过适配器是针对内容,而command是针对事件。

2.应用:android 中的点击监听事件就是command模式,对此我们也可以模仿源码来实现一个command模式。以系统Button的点击事件为原型,模仿自定义一个MyButton的设置点击监听事件。

a. 先看Button中的源码:

public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}

public void setOnClickListener(OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
public boolean performClick() {
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);

ListenerInfo li = mListenerInfo;
if (li != null && li.mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
li.mOnClickListener.onClick(this);
return true;
}

return false;
}


b.模仿button:

// 1.自定义一个接口:
public interface onMyButtonClickListener {
// 抽象的业务方法:
public void mybusiness();
}

// 2.添加监听器
private onMyButtonClickListener listener;
public void setOnMyButtonClickListener(onMyButtonClickListener listener) {
this.listener = listener;
}

@Override
public boolean performClick() {
// 点击button 按钮的时候,就会调用该方法:
// 在此方法中,可以实现业务类:用接口实现,具体业务类分离出来
// 3.内部调用监听器:==》一定要调用
if (listener != null) {
listener.mybusiness();
}
return super.performClick();
}


经过以上代码:MyButton就定义好了,现在在activity中调用该方法,看看能否响应点击事件:

public class MainActivity extends Activity {

private MyButton mButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mButton = (MyButton) findViewById(R.id.mybutton);
mButton.setOnMyButtonClickListener(new onMyButtonClickListener() {
@Override
public void mybusiness() {
Toast toast = Toast.makeText(getApplicationContext(), "响应点击事件", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
});
}
}


看测试结果,说明OK.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息