前言
定义一个操作的算法步骤,固化一个算法流程,子类按着自己的需求复写父类的部分方法,使得子类可以不改变固化的算法步骤,即可重新定义该过程的特定步骤。这个最熟悉的应该是Activity的生命周期,当然各种组件的生命周期都是模板模式的,这个就很容易理解了。
适用对象
1,多个过程逻辑基本相同。
2,重复的算法,可以提取核心作为模板,子类各抒己见。
3,很多时候我们要简化Activity或者其他类的逻辑,提取公用方法,比如我们Activity都要注册广播。
角色扮演
AbsTemplate:抽象类,固化算法步骤,或者说定义一套算法的框架。
ConcreteImpl:具体实现类,这个具体实现类是多个公用一套框架的对象。
Demo
这个就简单来一个排序过程吧,我们要完成一个排序过程,但至于怎么排序就让子类决定。
AbsTemplate:
package com.demo.template;
import java.util.List;
/**
* Created by italkbb on 2017/12/26.
*/
public abstract class AbsTemplate {
// 抽象出一个排序过程
abstract void sort(List<Integer> lists);
// 展示排完的数据
public void show(List<Integer> lists){
this.sort(lists);
for (int i = 0; i < lists.size(); i++){
System.out.printf(String.valueOf(lists.get(i)));
}
}
}
我们首先用冒泡排序来实现这个过程:
package com.demo.template;
import java.util.List;
/**
* Created by italkbb on 2017/12/26.
*/
public class BubbleSort extends AbsTemplate {
@Override
void sort(List<Integer> lists) {
for (int i = 0; i < lists.size() - 1; i++) {
for (int j = 1; j < lists.size() - i; j++) {
Integer temp;
if ((lists.get(j - 1)).compareTo(lists.get(j)) > 0) {
temp = lists.get(j - 1);
lists.set((j - 1), lists.get(j));
lists.set(j, temp);
}
}
}
}
}
然后用系统的排序再实现一个:
package com.demo.template;
import java.util.Collections;
import java.util.List;
/**
* Created by italkbb on 2017/12/26.
*/
public class SimpleSort extends AbsTemplate {
@Override
void sort(List<Integer> lists) {
Collections.sort(lists);
}
}
简单的模拟了一个模板模式,这个使用就很简单了,就不记录了。
后记
可能这个demo太过于简单,其实我们在开发中也这样,抽象各种步骤,比如我们这会儿的项目就是在fragment的页面方法抽象出来,让子类实现自己的view:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mContext = this.getActivity();
initView();
initTitle();
initData();
initOnClickListener();
((BaseActivity) this.getActivity()).setCurrentVisiableFragment(this);
}
这也是固化一个步骤优点就是封装了固有步骤,简化了代码量,提取了公用的代码,以便于日后维护。缺点就是刚入门的时候可能寻找架构的学习量多一些。