模板方法模式(Template Method)

定义:
 
定义一个模板结构,将具体内容延迟到子类去实现。
 
解决的问题:
 
  • 提高代码复用性。将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
  • 实现了反向控制。通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”
 
 
uml类图:
 
 
模式组成:
 
  • AbstractClass:抽象类。实现了模板方法,定义了算法的骨架
  • ConcreteClass:具体类。实现抽象类中的抽象方法,已完成完整的算法
 
优点:
 
  • 提高代码复用性
将相同部分的代码放在抽象的父类中
  • 提高了拓展性
将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为
  • 实现了反向控制
通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
 
 
缺点:
 
  • 引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度

举个栗子:

定义抽象角色

abstract class AbstractPerson {
    public void prepareGotoSchool() {
        dressup();
        eatBreakfast();
        takeThings();
    }

    void dressup() {
        System.out.println("穿衣洗漱");
    }

    protected abstract void eatBreakfast();

    protected abstract void takeThings();
}

定义具体实现

class Student extends AbstractPerson {
    @Override
    protected void eatBreakfast() {
        System.out.println("吃妈妈做好的早餐");
    }

    @Override
    protected void takeThings() {
        System.out.println("背书包,带好作业去学校");
    }
}

定义具体实现

class Teacher extends AbstractPerson {
    @Override
    protected void eatBreakfast() {
        System.out.println("做早饭,并照顾孩子吃早饭");
    }

    @Override
    protected void takeThings() {
        System.out.println("带上昨晚准备的试卷");
    }
}

客户端调用

public static void main(String[] args) {
        Student s = new Student();
        Teacher t = new Teacher();
        s.prepareGotoSchool();
        System.out.println("=============");
        t.prepareGotoSchool();
    }

输出

原文地址:https://www.cnblogs.com/amei0/p/8057693.html