文章目录
概念
在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统
时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些
步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。
例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业
务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行
评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务
却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。
代码实现
直接看代码:
举一个小例子:每天都在使用的app或游戏
public abstract class TemplateMethod {
/**
* 举一个打游戏的例子
*/
public final void process(){
//第一步,打开手机或电脑
this.open();
//第二步,点击app\game
this.click();
//第三步,登录个人账号
this.login();
//第四步,使用
this.use();
}
public void open(){
System.out.println("打开手机");
}
/*
这里任意一个方法如果有较多的变化就可以将它做成抽象方法,让子类实现,
eg: 登录方法(qq登录、微信登录、xx登录),就可以把login定义为抽象方法,调用的时候创建对应的实现类即可
*/
public abstract void click();
public void login(){
System.out.println("登录");
}
public void use() {
System.out.println("使用xxxx");
}
}
随便顶一个实现类
public class TestImpl extends TemplateMethod{
@Override
public void click() {
System.out.println("点个赞吧");
}
}
测试
public class Test {
public static void main(String[] args) {
//多态,到时候像调用什么方法,创建对应的实现类即可
TemplateMethod templateMethod = new TestImpl();
templateMethod.process();
}
}
为什么使用模板方法模式?
优点
- 复用
相同的代码放在抽象的父类中,将不同的代码放入不同的实现子类中 - 符合开闭原则
对扩展开发,对修改关闭
缺点
- 实现子类太多,类继承关系较为复杂
- 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,提高了代码阅读的难度
如何用:
流程整体固定,个别部分会发生变化,可以使用模板方法模式,将容易变化的部分抽象出来,实现不同的子类
总结:简单,好用