模板方法模式定义
Template Method Pattern: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
上面的意思就是说,在一个操作中定义一个算法的框架,推迟一些步骤到子类中(我的理解就是,将父类中的某些抽象方法在子类中进行具体实现),模板方法让子类在不改变算法结果的情况下,重新定义算法中的某些步骤.
模式结构图
代码示例
1.定义抽象父类,也就是算法的骨架
public abstract class AbstractLife { private void begin(){ System.out.println("早上打卡"); } //定义抽象方法,子类中具体实现 protected abstract void work(); private void end(){ System.out.println("下午打卡"); } public abstract void freeTime(); public void dayLife(){ begin(); work(); end(); freeTime(); } }
2.定义子类,继承父类方法
public class CommonOfficeWorker extends AbstractLife{ @Override public void work() { System.out.println("普通上班族,正常上班"); } @Override public void freeTime() { System.out.println("自由活动"); } }
public class SpecialProgrammer extends AbstractLife{ @Override public void work() { System.out.println("程序员,正常上班"); } @Override public void freeTime() { System.out.println("苦逼加班"); } }
3.测试类(因为java面向对象的特性,运行时,子类会重写父类的抽象方法)
public class TestMain { public static void main(String[] args) { AbstractLife common = new CommonOfficeWorker(); AbstractLife special = new SpecialProgrammer(); common.dayLife(); System.out.println("-----------"); special.dayLife(); } }
4.运行结果
优缺点
优点:把不变的放到父类,把变化的细节在子类中具体重新定义,也可以有新的定义,有助于扩展,同时也简化了代码结构.
缺点:每个实现都需要定义一个子类,如果子类特别多,那么这将会非常庞大,设计会越来越抽象.