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、模式图解
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、不同方法描述
- 模板方法
定义在抽象类中的,把基本操作方法组合在一起形成一个总流程的方法,可以有任意多个模板方法。
- 基本方法
- 抽象方法:抽象方法由抽象类声明,由具体子类实现。
- 具体方法:具体方法由抽象类声明并实现,而子类并不实现。
- 钩子方法:钩子方法由抽象类声明并实现,而子类可以加以扩展。
三、javaee应用
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