05_TemplateMethod 模板方法 ——抽取相同代码放到父类

GoF 定义: 定义算法中的骨架,把一些步骤推迟到子类中。模板方法让子类重写算法的特定步骤,而不改变算法的结构。( Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. The template method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.)

模板方法其实就是面向对象语言中最基本的实现:代码复用,子类继承。任何编程语言的入门教材中都会提到,把相同的代码抽出成父类,在子类里实现差异的部分,只是没有告诉你这就叫【模板方法】。

 

例如,我们有一个解析日期的程序,主要有两个功能,解析和打印。日期可以写成不同的格式:1) yyyy-dd-mm, 2) yyyy/mm/dd,但打印日期的方法是一样的。所以,可用把打印的功能放在父类中,将解析的功能放在子类中。

 

public class Main {

    public static void main(String[] args) {
        String date1 = "2020/09/26";
        ParseDate parseDataForm1 = new ParseDateForm1();
        parseDataForm1.printDate(date1);

        String date2 = "2020-26-30";
        ParseDate parseDataForm2 = new ParseDateForm2();
        parseDataForm2.printDate(date2);
    }
}

abstract class ParseDate {
    protected int yyyy;
    protected int mm;
    protected int dd;

    void printDate(String str) {
        parse(str);
        System.out.println(String.format("Date: %d-%02d-%02d", yyyy, mm, dd));
    }

    abstract void parse(String str);
}

// parse yyyy/mm/dd
class ParseDateForm1 extends ParseDate{
    @Override
    void parse(String str) {
        String[] splited = str.split("\\/");
        yyyy = Integer.valueOf(splited[0]);
        mm = Integer.valueOf(splited[1]);
        dd = Integer.valueOf(splited[2]);
    }
}

// parse yyyy-dd-mm
class ParseDateForm2 extends ParseDate{
    @Override
    void parse(String str) {
        String[] splited = str.split("-");
        yyyy = Integer.valueOf(splited[0]);
        mm = Integer.valueOf(splited[2]);
        dd = Integer.valueOf(splited[1]);
    }
}

类图:

后记:模板方法就是最简单的代码复用思想——父类中实现公共方法,在继承的子类中实现不同方法。

需要注意的是,尽可能减少父类中的abstract方法,如果子类中需要重写一大堆抽象方法,那可能就需要重新审视设计思路是否正确了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值