模版方法设计模式

模版方法设计模式

未使用模板方法设计模式

首先看一个不使用模版方法设计模式的几个类

可以将Student类和Worker类中的day()方法内的代码看作是算法,可以发现,Student类和Worker类的算法相同,不同的只是算法的每一个步骤的具体实现细节。

两个类中的算法相同,每个类也都要写一遍,代码冗余,而且修改算法步骤也不方便

public class Student {
    /**/
    public void day(){
        System.out.println("学生起床");
        System.out.println("学生上课");
        System.out.println("学生放学");
    }
}
public class Worker {

    public void day(){
        System.out.println("工人起床");
        System.out.println("工人上班");
        System.out.println("工人下班");
    }
}

/*测试类*/
public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.day();

        Worker worker = new Worker();
        worker.day();
    }
}

使用模版方法设计模式

  • Person类

    templateMethod()是一个模版方法,定义核心算法骨架,具体的实现步骤延迟到子类中完成

    算法为了受到保护,所以模版方法一般都使用final修饰,不被重写

    核心算法骨架不需要每一次在具体的类中编写了,这个核心算法只在模版方法中编写一次

    算法步骤改变,只要更改模版就可以,同时也避免了算法在每一个具体的类中编写而冗余

  • Student类 Worker类

    Student和Worker只需要关心算法的具体实现细节即可,不需要关心算法的步骤

    也不需要在每一个类中都写上算法,这样避免了代码冗余,增加了模板方法的代码通用性

    修改代码的算法步骤也只需要修改模板类即可

public abstract class Person {
    /**
     * templateMethod是一个模版方法,定义核心算法骨架,具体的实现步骤延迟到子类中完成
     * 算法为了受到保护,所以模版方法一般都使用final修饰,不被重写
     * 核心算法骨架不需要每一次在具体的类中编写了,这个核心算法只在模版方法中编写一次
     * 算法步骤改变,只要更改模版就可以,同时也避免了算法在每一个具体的类中编写而冗余
     */
    public final void templateMethod() {
        //核心算法骨架
        do1();
        do2();
        do3();
    }
    /**
     * 这就是具体的实现,这个具体的步骤可以延迟到子类中完成
     * 这个方法通常是抽象方法
     */
    protected abstract void do1();
    protected abstract void do2();
    protected abstract void do3();
}

public class Student extends Person {
    @Override
    protected void do1() {
        System.out.println("学生起床");
    }

    @Override
    protected void do2() {
        System.out.println("学生上课");
    }

    @Override
    protected void do3() {
        System.out.println("学生放学");
    }
}

public class Worker extends Person{
    @Override
    protected void do1() {
        System.out.println("工人起床");
    }

    @Override
    protected void do2() {
        System.out.println("工人上班");
    }

    @Override
    protected void do3() {
        System.out.println("工人下班");
    }
}

public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.templateMethod();

        Worker worker = new Worker();
        worker.templateMethod();
    }
}

总结

模版方法设计模式属于行为行设计模式

模版方法有一个特点:doXXX()

模板方法设计模式的主要作用:

  1. 核心算法得到保护
  2. 核心算法得到复用
  3. 在不改变算法的前提下,却可以重新定义算法步骤的具体实现

模板方法设计模式的例子

  • Servlet规范中的HttpServlet

  • HttpServlet就是一个典型的模板方法设计模式

  • HttpServlet是一个模板类

  • 其中的service(HttpServletRequest, HttpServletResponse)方法是典型的模板方法,该方法中定义了核心算法骨架,doGet()、doPost()…具体的实现细节延迟到子类中完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值