本文转载:https://blog.csdn.net/qq_20143059/article/details/102659949
定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
优点:1.封装不变部分,扩展可变部分
2.提取公共部分代码,便于维护
缺点:1.提高了系统的复杂度。
使用场景:一些方法通用,一些方法不通用,却在每一个子类都重新写了这所有的方法。
类图:
模板代码:
抽象模板类
static abstract class AbstractTemplate {
//公有方法 但是可以复写
protected void operateA() {
System.out.println("A");
}
protected void operateB() {
System.out.println("B");
}
//不同的方法
protected abstract void operateC() ;
// 声明为final方法,避免子类覆写
// 固定的步骤
public final void templateMehthod() {
this.operateA();
this.operateB();
this.operateC();
}
}
具体实现类A
static class ConcreteClassA extends AbstractClass {
@Override
protected void operateC() {
System.out.println("C");
}
}
具体实现类B
static class ConcreteClassB extends AbstractClass {
@Override
protected void operateB() {
System.out.println("B+");
}
@Override
protected void operateC() {
System.out.println("C");
}
}
栗子
抽象模板类
static abstract class AbstractPlayLol {
protected void openComputer() {
System.out.println("开机了");
}
protected void playGame() {
System.out.println("开始玩");
}
//结果不相同
protected abstract void over() ;
// 声明为final方法,避免子类覆写
public final void templateMehthod() {
this.openComputer();
this.playGame();
this.over();
}
}
抽象实现
static class ConcreteClassA extends AbstractPlayLol {
@Override
protected void over() {
System.out.println("15投");
}
}
static class ConcreteClassB extends AbstractPlayLol {
@Override
protected void openComputer() {
System.out.println("电脑坏了");
}
@Override
protected void playGame() {
System.out.println("没玩上");
}
@Override
protected void over() {
System.out.println("没玩上");
}
}
调用
class Client {
public static void main(String[] args) {
AbstractPlayLol playA= new ConcreteClassA();
cookVegetable.cook();
AbstractPlayLol playB= new ConcreteClassB();
cookVegetable.cook();
}