概述
- 介绍:面向对象程序中,设计一个系统知道了算法所需的关键步骤,而且确定了执行顺序,但是某些步骤的具体实现还未知,或者具体的实现和具体的环境相关。
- 定义:定义一个操作中的算法骨架,而将其中一些步骤延迟到子类中实现,使得子类在不改变算法结构的情况下重新定义该算法的某些特定步骤。
银行办理业务:已经知道流程 1取号 2排队 3业务办理 4评分 124 在父类中实现 3因情况而异 可以延迟在子类实现 所以定义父类为抽象类 包含 【124 的具体方法 】和【 3 的抽象方法(子类实现)】 【模板方法】
结构
1 抽象类:给出算法的轮廓和骨架 由一个模板方法和若干基本方法组成
- 模板方法:定义骨架,按顺序调用其包含的基本方法
- 基本方法:实现各步骤的方法
- 抽象方法
- 具体方法
- 钩子方法:一般用于判断逻辑 isXXX 返回值为boolean
2 具体子类: 实现抽象方法和钩子方法
炒菜抽象类:
/**
* 炒菜流程 倒油 热油 倒菜 倒调料 翻炒
* 父抽象类 定义模板方法和基本方法
*/
public abstract class AbstractClass {
//模板方法定义 也就是炒菜流程
public final void cookProcess(){
pourOil();
hotOil();
pourVegetable();
pourSauce();
fry();
}
public void pourOil(){
System.out.println("倒油");
}
public void hotOil(){
System.out.println("热油");
}
public abstract void pourVegetable();//倒蔬菜因情况而异 所以使用抽象方法 由子类(各种蔬菜)实现
public abstract void pourSauce();//倒调料
public void fry(){
System.out.println("翻炒直至熟");
}
}
炒冬瓜的具体子类
public class CookDongGua extends AbstractClass{
@Override
public void pourVegetable() {
System.out.println("倒入冬瓜");
}
@Override
public void pourSauce() {
System.out.println("倒入冬瓜调料");
}
}
炒茄子具体子类
public class CookQieZi extends AbstractClass{
@Override
public void pourVegetable() {
System.out.println("倒入茄子");
}
@Override
public void pourSauce() {
System.out.println("倒入茄子调料");
}
}
测试类
public class CookTest {
public static void main(String[] args) {
CookQieZi cookQieZi = new CookQieZi();
cookQieZi.cookProcess();
/** 输出结果
* 倒油
* 热油
* 倒入茄子
* 倒入茄子调料
* 翻炒直至熟
*/
CookDongGua cookDongGua = new CookDongGua();
cookDongGua.cookProcess();
}
}
优缺点
优点
- 提高代码复用性:相同部分的代码放到父类 不同的代码放到子类 解耦合
- 实现反向控制:子类具体实现扩展不同的行为 实现反向控制 符合开闭原则
缺点 - 系统更加庞大 阅读难度增大