Live2D
复制代码

10-模板方法设计模式

前面所学习的HttpServlet类所使用的设计方式是23种设计模式中的模板方法设计模式,这种设计模式有什么优点和特点下面来探讨。

1、普通的方式展示模板方法设计模式

创建一个学生类和一个工人类,两个类中都有一个day方法表示一天的行为

1.1 Student.java

package com.servlet.http.notemplate;

//不使用模板方法设计模式
public class Student {

    public void day(){
        System.out.println("学生起床");
        System.out.println("学生上课");
        System.out.println("学生放学");
        System.out.println("学生吃饭");
        System.out.println("学生睡觉");
    }

}

1.2 Worker.java

package com.servlet.http.notemplate;

public class Worker {
    public void day(){
        System.out.println("工人起床");
        System.out.println("工人上班");
        System.out.println("工人下班");
        System.out.println("工人吃饭");
        System.out.println("工人睡觉");
    }
}

1.3 测试类Test.java

package com.servlet.http.notemplate;

public class Test {

    public static void main(String[] args) {

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

}

现实开发中完成业务需求需要多个平级的Servlet实现类,这些类中都有一套算法完成需求,有时候这些类中的算法骨架是一样的。

我们将day方法看作是一个算法,可以看到上面两个类中的核心算法骨架都是一样的,如果多出几个类的话,我们就需要在每个类中都编写同一种算法,消耗时间。

这样的后果就会使代码冗余,并且可能某个类中大意出错,不能很好的保护算法,算法会被修改

3、下面使用模板方法设计模式

3.1 编写一个模板类

这个类是一个抽象类,如下:

package com.servlet.http.usetemplate;


/**
 * PersonTemplate符合模板方法设计
 * PersonTemplate是一个模板类,抽象类
 */
public abstract class PersonTemplate {

    /**
     * templateMethod是一个模板方法,它定义算法核心骨架,具体实现步骤延迟到模板类的子类中实现
     * 为了使核心算法骨架受到保护,模板方法一般被final修饰
     * 作用:算法骨架不需要在每个业务类中编写了,只需要在模板方法中编写一次
     */
    public void templateMethod(){

        //核心算法骨架
        do1();
        do2();
        do3();

    }

    /**
     * 下面方法就是具体的实现步骤之一,可以延迟到子类中完成
     * 通常是抽象方法,所以模板类也是抽象类
     */
    public abstract void do1();
    public abstract void do2();
    public abstract void do3();

}

3.2 Student类和Worker类继承模板类

重写其中的抽象方法,如下:

Student.java
package com.servlet.http.usetemplate;

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

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

    @Override
    public void do3() {
        System.out.println("学生放学");
    }
}
Worker.java
package com.servlet.http.usetemplate;

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

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

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

测试类Test.java
package com.servlet.http.usetemplate;

public class Test {

    public static void main(String[] args) {

        //用模板类定义一个Student对象,明显是多态的运用
        PersonTemplate student = new Student();
        PersonTemplate worker = new Worker();

        //子类都可以调用模板方法templateMethod
        //模板发设计模式就是基于多态来实现的
        student.templateMethod();
        worker.templateMethod();

        //其特点就是,这个模板类的子类的核心算法骨架相同,保存在一个模板方法中,这个模板方法
        //在子类中无需重写,模板方法中的内容是各个Servlet实现类中都固定死,模板嘛,顾名思义
        //需要程序员编写的就是模板方法中调用的其他方法,这些方法就是需要程序员写的业务代码
        //且这些方法在子类中各自重写实现,子类含义不同,实现步骤就有所不同
    }

}
向上面这样的使用模板方法设计模式,如果我们想改算法,这里我们就修改do1与do2方法的执行顺序,只要在模板方法中修改就可以将其所有子类中的都修改到了,一改一大批。这体现着一种面向抽象,面向父类编程的思想,不能面向具体编程。
--模板方法设计模式
	Servlet规范中的:HttpServlet
	这个类是一个模板类
	其中有两个service方法,构成方法的重载,其中有protected权限关键字修饰的
	service(HttpServletRequest request,HttpServletResponse response)方法
	是典型的模板方法,其定义了核心算法骨架
	如doGet(),doPost(),...具体的实现步骤延迟到子类中完成
--模板方法设计特点
	doXXX
	doYYY
	doNNN
	
--模板方法设计模式属于:行为型设计模式

--作用
	1、核心算法受到保护
	2、核心算法得到复用
	3、在不改变算法结构的前提下,可以重新定义算法具体步骤实现
posted @ 2021-08-08 00:04  Milen-jie  阅读(30)  评论(0编辑  收藏  举报