Android设计模式应用-模板方法模式
2016-04-03 19:05
645 查看
模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1…n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,先看个关系图:
就是在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和 Minus分别继承AbstractCalculator类,通过对AbstractCalculator的调用实现对子类的调用,看下面的例子:
public abstract class AbstractCalculator {
/*主方法,实现对本类其它方法的调用*/
public final int calculate(String exp,String opt){
int array[] = split(exp,opt);
return calculate(array[0],array[1]);
}
/*被子类重写的方法*/
abstract public int calculate(int num1,int num2);
public int[] split(String exp,String opt){
String array[] = exp.split(opt);
int arrayInt[] = new int[2];
arrayInt[0] = Integer.parseInt(array[0]);
arrayInt[1] = Integer.parseInt(array[1]);
return arrayInt;
}
}
public class Plus extends AbstractCalculator {
@Override
public int calculate(int num1,int num2) {
return num1 + num2;
}
}
测试类:
public class StrategyTest {
public static void main(String[] args) {
String exp = “8+8″;
AbstractCalculator cal = new Plus();
int result = cal.calculate(exp, “\\+”);
System.out.println(result);
}
}
这个方法讲的应该是比较容易懂的,但是还没有说到点子上,模板方法实际上指:一件事的执行是有流程顺序的,会涉及到很多步骤,这里面的很多步骤就是指1...n个方法,把这些步骤都包在一起,就有一个主方法;其中很多步骤里面的各个方法是抽象,这个可以让子类是实现,有这样的一个特性就是模板方法,否则即使子类实现了抽象类里面的方法,也仅仅是一个继承的过程,因为没有说那个流程,抽象类的主方法就是把所有的流程封装在一起,供外部调用。
android里面最常见的 模板方法就是:android的activity的生命周期,一个activity从创建到销毁是有一个过程的,oncreate,onstart,onresume,onpause,onstop,ondestroy,其他的先不写,这些方法是有流程的,我们可以重写,这就是模板方法模式的具体应用
Android里面AsyncTask的各个方法的执行也是有顺序的,我们在实现的时候也是可以重写的,也是一个模板方法模式的具体应用
execute(params),onpreexecute(),dobackground,onpostexcute,publishprogress,mainUI,onprogressUpdate(progress)
------------------------------------------------------------------------------
|- AsyncTask内的各个方法调用顺序:
|- 首先,用户调用execute方法,启动AsyncTask 。然后在execute方法中:
|- 首先调用onPreExecute方法,执行初始化操作。
|- 然后从线程池中取出若干个空闲的线程,并使用该线程调用doInBackground方法,执行耗时的操作,如文件下载等。
|- 提示:调用execute方法时设置的参数会被直接传递给doInBackground方法。
|- 当doInBackground方法执行完毕后,onPostExecute方法将被调用。onPostExecute方法的参数就是doInBackground方法的返回值。
|- 若doInBackground方法中途被终止,则同样会调用onPostExecute方法,但是方法的参数却为null 。
|- 若想更新UI控件,则可以在doInBackground方法中调用publishProgress方法向主线程中的Handler发送消息,Handler接到消息后会转调用onProgressUpdate方法来更新UI。
|- 提示:调用publishProgress方法时设置的参数将被传递给onProgressUpdate方法。
在上面的范例中,各个方法的参数、返回值都是Object类型的,这对于严格控制程序有很大负面的影响。但是事实上,AsyncTask类是有泛型的。
(重要:Note)
AsyncTask<Params, Progress, Result> 其中:
|- Params:用于设置execute和doInBackground方法的参数的数据类型。
|- Progress:用于设置onProgressUpdate和publishProgress方法的参数的数据类型。
|- Result:用于设置onPostExecute方法的参数的数据类型和doInBackground方法的返回值类型。
就是在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和 Minus分别继承AbstractCalculator类,通过对AbstractCalculator的调用实现对子类的调用,看下面的例子:
public abstract class AbstractCalculator {
/*主方法,实现对本类其它方法的调用*/
public final int calculate(String exp,String opt){
int array[] = split(exp,opt);
return calculate(array[0],array[1]);
}
/*被子类重写的方法*/
abstract public int calculate(int num1,int num2);
public int[] split(String exp,String opt){
String array[] = exp.split(opt);
int arrayInt[] = new int[2];
arrayInt[0] = Integer.parseInt(array[0]);
arrayInt[1] = Integer.parseInt(array[1]);
return arrayInt;
}
}
public class Plus extends AbstractCalculator {
@Override
public int calculate(int num1,int num2) {
return num1 + num2;
}
}
测试类:
public class StrategyTest {
public static void main(String[] args) {
String exp = “8+8″;
AbstractCalculator cal = new Plus();
int result = cal.calculate(exp, “\\+”);
System.out.println(result);
}
}
这个方法讲的应该是比较容易懂的,但是还没有说到点子上,模板方法实际上指:一件事的执行是有流程顺序的,会涉及到很多步骤,这里面的很多步骤就是指1...n个方法,把这些步骤都包在一起,就有一个主方法;其中很多步骤里面的各个方法是抽象,这个可以让子类是实现,有这样的一个特性就是模板方法,否则即使子类实现了抽象类里面的方法,也仅仅是一个继承的过程,因为没有说那个流程,抽象类的主方法就是把所有的流程封装在一起,供外部调用。
android里面最常见的 模板方法就是:android的activity的生命周期,一个activity从创建到销毁是有一个过程的,oncreate,onstart,onresume,onpause,onstop,ondestroy,其他的先不写,这些方法是有流程的,我们可以重写,这就是模板方法模式的具体应用
Android里面AsyncTask的各个方法的执行也是有顺序的,我们在实现的时候也是可以重写的,也是一个模板方法模式的具体应用
execute(params),onpreexecute(),dobackground,onpostexcute,publishprogress,mainUI,onprogressUpdate(progress)
------------------------------------------------------------------------------
|- AsyncTask内的各个方法调用顺序:
|- 首先,用户调用execute方法,启动AsyncTask 。然后在execute方法中:
|- 首先调用onPreExecute方法,执行初始化操作。
|- 然后从线程池中取出若干个空闲的线程,并使用该线程调用doInBackground方法,执行耗时的操作,如文件下载等。
|- 提示:调用execute方法时设置的参数会被直接传递给doInBackground方法。
|- 当doInBackground方法执行完毕后,onPostExecute方法将被调用。onPostExecute方法的参数就是doInBackground方法的返回值。
|- 若doInBackground方法中途被终止,则同样会调用onPostExecute方法,但是方法的参数却为null 。
|- 若想更新UI控件,则可以在doInBackground方法中调用publishProgress方法向主线程中的Handler发送消息,Handler接到消息后会转调用onProgressUpdate方法来更新UI。
|- 提示:调用publishProgress方法时设置的参数将被传递给onProgressUpdate方法。
在上面的范例中,各个方法的参数、返回值都是Object类型的,这对于严格控制程序有很大负面的影响。但是事实上,AsyncTask类是有泛型的。
(重要:Note)
AsyncTask<Params, Progress, Result> 其中:
|- Params:用于设置execute和doInBackground方法的参数的数据类型。
|- Progress:用于设置onProgressUpdate和publishProgress方法的参数的数据类型。
|- Result:用于设置onPostExecute方法的参数的数据类型和doInBackground方法的返回值类型。
相关文章推荐
- 关于Android studio 2.0beta5最近提示的Plugin is too old
- Android源码设计模式解析与实战(Based on Lollipop) 第一章 读书笔记
- Android设计模式应用-责任链模式
- Android 学习记录-布局预览错误
- Android图形graphics--Canvas的save,restore,rotate的理解
- Android MVP 详解(上)
- Android 编码规范
- Android实现一个自定义相机的界面
- android实现静默安装demo
- 配置Android studio 项目上传jcenter 时 gradle 报以下错误
- Android 全局获取 Context 与使用 Intent 传递对象
- (记录学习android遇到的问题)使用被weight分配空间后的控件高度值画新控件出现的问题
- [android] 常见对话框
- Android——实现欢迎界面的自动跳转(转)
- Android 贝塞尔曲线实现QQ拖拽清除效果
- Android SQLiteOpenHelper
- Android设计模式应用--策略模式
- Android设计模式之单例模式
- Android任务和返回栈完全解析,细数那些你所不知道的细节
- Android设计模式应用--工厂模式