欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java描述设计模式(19):模板方法模式

程序员文章站 2022-04-14 19:58:24
本文源码: "GitHub·点这里" || "GitEE·点这里" 一、生活场景 通常一款互联网应用的开发流程如下:业务需求,规划产品,程序开发,测试交付。现在基于模板方法模式进行该过程描述。 二、模板方法模式 1、基础概念 模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构 ......

本文源码: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、模式图解

Java描述设计模式(19):模板方法模式

3、核心角色

  • 抽象模板角色

类中实现了模板方法(template),定义流程结构,具体业务需求子类需要去实现。

  • 具体模板角色

实现父类所定义的一个或多个抽象方法,是整个流程的组成方法。抽象模板角色都可以有任意多个具体模板角色与之对应,具体模板角色都可以给出这些抽象方法的不同实现。

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应用

Java描述设计模式(19):模板方法模式

httpservlet担任抽象模板角色,模板方法:由service()方法担任。基本方法:由dopost()、doget()等方法担任。service()方法流程,省略了部分判断逻辑。该方法调用七个do方法中的一个或几个,完成对客户端请求的响应。这些do方法需要由httpservlet的具体子类提供,在javaee中使用时,通常会自己实现相关方法。在api的封装是典型的模板方法模式。

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

Java描述设计模式(19):模板方法模式