本文源码:GitHub·点这里 || GitEE·点这里

一、生活场景

通常一款互联网应用的开发流程如下:业务需求,规划产品,程序开发,测试交付。现在基于模板方法模式进行该过程描述。

public class C01_InScene {
    public static void main(String[] args) {
        DevelopApp developApp = new DevelopApp() ;
        developApp.templateMethod() ;
    }
}
/**
 * 软件开发抽象类
 */
abstract class SoftDevelop {
    public void templateMethod(){
        //调用基本方法
        doBiz ();
        doProduct();
        doDevelop();
        doTest();
    }
    public abstract void doBiz () ;
    public abstract void doProduct () ;
    public abstract void doDevelop () ;
    public abstract void doTest () ;
}
/**
 * APP开发具体类
 */
class DevelopApp extends SoftDevelop {
    @Override
    public void doBiz() {
        System.out.println("整理App业务");
    }
    @Override
    public void doProduct() {
        System.out.println("输出App产品");
    }
    @Override
    public void doDevelop() {
        System.out.println("进行App开发");
    }
    @Override
    public void doTest() {
        System.out.println("进行App测试");
    }
}

二、模板方法模式

1、基础概念

2、模式图解

3、核心角色

  • 抽象模板角色
  • 具体模板角色

4、源码实现

/**
 * 抽象模板角色
 */
abstract class AbstractTemplate {
    /**
     * 模板方法
     */
    public void templateMethod(){
        //调用基本方法
        abstractMethod();
        hookMethod();
        concreteMethod();
    }
    /**
     * 相关基本方法
     */
    protected abstract void abstractMethod();
    protected void hookMethod(){}
    private final void concreteMethod(){}
}
/**
 * 具体模板角色
 */
class ConcreteTemplate extends AbstractTemplate{
    /**
     * 基本方法的实现
     */
    @Override
    public void abstractMethod() {
    }
    /**
     * 重写父类的方法
     */
    @Override
    public void hookMethod(){
    }
}

5、不同方法描述

  • 模板方法

定义在抽象类中的,把基本操作方法组合在一起形成一个总流程的方法,可以有任意多个模板方法。

  • 基本方法
  1. 抽象方法:抽象方法由抽象类声明,由具体子类实现。
  2. 具体方法:具体方法由抽象类声明并实现,而子类并不实现。
  3. 钩子方法:钩子方法由抽象类声明并实现,而子类可以加以扩展。

三、JavaEE应用

protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    if (method.equals("GET")) {
        this.doGet(req, resp);
    } else if (method.equals("HEAD")) {
        this.doHead(req, resp);
    } else if (method.equals("POST")) {
        this.doPost(req, resp);
    } else if (method.equals("PUT")) {
        this.doPut(req, resp);
    } else if (method.equals("DELETE")) {
        this.doDelete(req, resp);
    } else if (method.equals("OPTIONS")) {
        this.doOptions(req, resp);
    } else if (method.equals("TRACE")) {
        this.doTrace(req, resp);
    } else {
        String errMsg = lStrings.getString("http.method_not_implemented");
        Object[] errArgs = new Object[]{method};
        errMsg = MessageFormat.format(errMsg, errArgs);
        resp.sendError(501, errMsg);
    }
}

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent
12-31 22:32
查看更多