前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之模板方法模式

设计模式之模板方法模式

作者头像
九转成圣
发布2024-04-10 16:39:06
1610
发布2024-04-10 16:39:06
举报
文章被收录于专栏:csdn

模板方法模式(Template Method Pattern)

定义

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。

使用场景

算法骨架固定,实现细节不一样

主要角色

  1. 抽象类 一般方法,可在抽象类中实现,也可以在子类实现
    • 基本方法:doSomething,doAnything 由子类实现的方法,并且在模板方法被调用
    • 模板方法:templateMethod实现对基本方法的调度,完成固定的逻辑
  2. 具体类

类图

示例代码

代码语言:javascript
复制
//抽象模板类
public abstract class AbstractClass {
    //基本方法
    protected abstract void doSomething();

    //基本方法
    protected abstract void doAnything();

    public void templateMethod() {
        //调用基本方法,完成相关逻辑
        this.doAnything();
        this.doSomething();
    }
}
代码语言:javascript
复制
//具体模板类
public class ConcreteClass1 extends AbstractClass {
    @Override
    protected void doSomething() {
        //业务逻辑
    }

    @Override
    protected void doAnything() {
        //业务逻辑
    }
}
代码语言:javascript
复制
//具体模板类
public class ConcreteClass2 extends AbstractClass {
    @Override
    protected void doSomething() {
        //业务逻辑
    }

    @Override
    protected void doAnything() {
        //业务逻辑
    }
}
代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        AbstractClass class1 = new ConcreteClass1();
        AbstractClass class2 = new ConcreteClass2();
        //调用模板方法
        class1.templateMethod();
        class2.templateMethod();
    }
}

工作中遇到场景

HttpServlet

代码语言:javascript
复制
public abstract class SimpleHttpServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        // 模板方法,定义了 HTTP 请求处理的骨架
        if (req.getMethod().equals("GET")) {
            doGet(req, resp);
        } else if (req.getMethod().equals("POST")) {
            doPost(req, resp);
        }
        // 其他 HTTP 方法的处理可以在这里扩展
    }

    protected abstract void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException;

    protected abstract void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException;
}

org.springframework.web.servlet.HttpServletBean#init

代码语言:javascript
复制
@Override
public final void init() throws ServletException {

    // Set bean properties from init parameters.
    PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
    if (!pvs.isEmpty()) {
        try {
            BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
            ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
            bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
            initBeanWrapper(bw);
            bw.setPropertyValues(pvs, true);
        }
        catch (BeansException ex) {
            if (logger.isErrorEnabled()) {
                logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
            }
            throw ex;
        }
    }

    // Let subclasses do whatever initialization they like.
    initServletBean();
}
代码语言:javascript
复制
protected void initServletBean() throws ServletException {
}

InputStream

代码语言:javascript
复制
public abstract class InputStream {
    // 模板方法
    public int read(byte b[], int off, int len) throws IOException {
        // ...
        int c = read();
        // ...
        return c;
    }

    // 抽象方法,由子类提供具体实现
    public abstract int read() throws IOException;
}

AbstractController

代码语言:javascript
复制
public abstract class AbstractController implements Controller {
    // 模板方法
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) {
        // 具体的请求处理逻辑由子类实现
        // ...
        return getModelAndView(request, response);
    }

    // 具体的请求处理逻辑由子类实现
    protected abstract ModelAndView getModelAndView(HttpServletRequest request, HttpServletResponse response);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模板方法模式(Template Method Pattern)
  • 定义
  • 使用场景
  • 主要角色
  • 类图
  • 示例代码
  • 工作中遇到场景
    • HttpServlet
      • InputStream
        • AbstractController
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档