java 设计模式:模版方法
模板方法模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差别适合于这种模式,如大话设计模式中说到的考试场景中,每个人的试卷都是一样的,只有答案不一样。这种场景就适合于模板方法模式。
模板方法模式适用的业务场景
- 算法或者操作遵循相似的逻辑
- 重构时(把相同的代码抽取到父类中)
- 重要、复杂的算法,核心算法设计为模板方法
代码实现
现在我有一个需求,就是要建立一套上课业务规则
- 上课
- 考情
- 下课
/**
* 班级规则
*/
public abstract class ClassShangke {
public void shangke(){
}
public abstract void kaoqing();
public void xiake(){
}
//注意模版规则 final 不可被重写
public final void guize(){
shangke();
kaoqing();
xiake();
}
}
/**
* A班级上课
*/
public class AClassKaoQing extends ClassShangke {
@Override
public void kaoqing() {
System.out.println("AClassKaoQing kaoqing");
}
}
/**
* B班级上课
*/
public class BClassKaoQing extends ClassShangke {
@Override
public void kaoqing() {
System.out.println("BClassKaoQing kaoqing");
}
}
//运行
ClassShangke classShangkea = new AClassKaoQing();
classShangkea.guize();
ClassShangke classShangkeb = new BClassKaoQing();
classShangkeb.guize();
我在项目中对网络请求返回数据进行模版方法定义
public abstract class BaseRxNetworkResponseObserver<T extends SModel> extends BaseRxNetworkObserver<T> {
@Override
public final void onNext(T t) {
onBeforeResponseOperation();
try{
onResponse(t);
}catch (Exception e){
ULog.e(e,e.getMessage());
ULog.e(e);
TipToast.shortTip(e.getMessage());
onResponseFail(new CustomarilyException(e.getMessage()));
}finally {
onNextFinally();
}
}
protected void onNextFinally() {
}
/**
* 返回值
* @param t
*/
public abstract void onResponse(T t);
/**
* 错误
* @param e
*/
public abstract void onResponseFail(Exception e);
/**
* 执行一些起始操作
*/
protected abstract void onBeforeResponseOperation();
}
注意模版方法的final 为了制定一些规则必须不可以被重写
模板方法模式的优点
- 封装性好
- 复用性好
- 屏蔽细节
- 便于维护