5.模板方法模式--抓住问题核心
2019-03-04 本文已影响0人
君袅
一 .定义
定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.
在面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需要的关键步骤,并确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现会随着环境的变化而改变,例如执行程序的流程大致如下:
1.检查代码的正确性;
2.链接相关的类库;
3.编译相关代码;
4.执行程序.
对于不同程序设计语言,上述4个步骤都是不一样的,但是,它们的执行流程是固定的,这类问题的解决方案就是模板方法模式.
二.使用场景
1.多个子类有公有的方法,并且逻辑基本相同时;
2.重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现;
3.重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为.
简单实现
一样是开计算机的流程,不同的人不同的打开密码
public abstract class AbsComputer {
/*
* 设计模式 将相同的总结在一起 不相同的有子类完善
* */
private static final String TAG = "AbsComputer";
public void startUp(){
Log.d(TAG, "准备启动: ");
poweron();//按下电源
checkHardWare();//检测硬件
loadOs(); //加载操作系统
login();
Log.d(TAG, "启动成功: ");
}
protected abstract void login();//输入密码
protected void loadOs(){
Log.d(TAG, "加载操作系统: ");
};
protected void checkHardWare(){
Log.d(TAG, "检测硬件: ");
};
protected void poweron(){
Log.d(TAG, "按下电源: ");
}
}
军队
public class ArmyComputer extends AbsComputer {
private static final String TAG = "军队";
@Override
protected void checkHardWare() {
super.checkHardWare();
Log.d(TAG, "检测防火墙: ");
}
@Override
protected void login() {
Log.d(TAG, "输入了多重1024位密码: ");
}
}
程序员
public class NbCoder extends AbsComputer {
private static final String TAG = "程序员";
@Override
protected void login() {
Log.d(TAG, "简单的锁 ");
}
}
小白
public class XiaoBai extends AbsComputer {
private static final String TAG = "小白";
@Override
protected void login() {
Log.d(TAG, "小白电脑没有密码,直接进入操作页面: ");
}
}
实现
private void template() {
new XiaoBai().startUp();
new NbCoder().startUp();
new ArmyComputer().startUp();
}
四.总结
模板方法模式用4个字概括:流程封装;也就是把某个固定流程封装到final函数中,并让子类定制这个流程中某个或者某些步骤;
优点:
1.封装不变部分,扩展可变部分;
2.提取公共部分代码,便于维护;
缺点:
模板方法会带来代码阅读的难度,会让用户觉得难以理解.