【设计模式】策略模式与模板模式的区别

概述

策略模式与模板模式在Spring中都广泛存在:

  • JDBCTemplate、RedisTemplate、MongoTemplate等均是典型的模板模式。
  • Spring MVC中各种处理handler,是典型的策略模式。

这两个模式感觉差不多,这两个模式怎么区别呢?

如何区别

策略模式和模板模式有一个最重要的区别,即模板模式一般只针对一套算法,注重对同一个算法的不同细节进行抽象提供不同的实现。而策略模式注重多套算法多套实现,在算法中间不应该有交集,因此算法和算法只间一般不会有冗余代码!

举个例子来说,我们知道 FreeMarker 是一个是一个模板引擎,一个基于模板生成文本输出的通用工具,当你设计一个页面的时候,提前写个html模版,假设是一个产品的详情页,那么包含价格、产地、名称、描述等属性信息,而他们的布局是固定的,因此,只要能获取不同商品的动态属性信息,填充到html模版里面,可以快速得到一个Html页面,这就是模版模式。

总结模版模式的特点:从头至尾,各个属性的位置都是固定的,是一个大而全的东西,固定了流程,按照模版来就行。各个抽象方法都是不重复的功能,有的渲染头部,有的选择底部。

再举个策略模式的例子。

对于展示信息给用户的浏览器来说,需要一个内容供自己渲染,那么这个页面是怎么来的呢?后台可以提供多种方案,可以是一个html静态页面,也可以是Servlet 生成的响应:

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("处理Get()请求...");
        //使servlet页面中文不会乱码,一定要放在getWriter()方法前面
        resp.setContentType("text/html; charset=utf-8");
        //添加上面这行才会解析html代码,显示Get()请求成功!的加粗模式,否则不会解析html代码,直接显示html标签
        PrintWriter out = resp.getWriter();
        out.println("<strong>Get()请求成功!</strong><br/>");
    }

这个响应可以是一个html页面,也可以是一个Html片段。

没关系,只要是符合html语法规则的就行,因此,这里的不同方案就对应一种策略。

总结策略模式的特点:是针对同一个算法,有不同的实现。各个策略完成的功能是重复的,同一时间,只能选择其中的一种,即互斥的。

参考

策略模式与模板模式的区别

策略模式模板模式和状态模式都是常用的设计模式,它们都是通过封装算法实现代码的灵活性和可复用性。下面是它们的对比: 1. 策略模式策略模式用于封装一组可以互相替换的算法,使得在运行时可以动态地选择其中的一种算法来进行处理。策略模式适用于多个算法之间互相独立,且可以在运行时动态选择的情况。在策略模式中,每个策略类都实现了一个共同的接口,使得它们可以互相替换。 2. 模板模式模板模式用于定义一个算法的框架,将算法的具体实现延迟到子类中。在模板模式中,定义了一个抽象类,其中包含了一个算法的框架(称为模板方法),以及若干个抽象方法,由子类来实现。模板模式适用于算法的框架可以固定,但是算法的具体实现可能有所不同的情况。 3. 状态模式:状态模式用于将一个对象的行为与其所处的状态分离开来,使得在运行时可以动态地改变对象的行为。在状态模式中,定义了一个抽象类,其中包含了一个状态的接口,以及若干个具体的状态类,每个状态类实现了这个接口。在运行时,对象可以根据当前状态来选择相应的行为。 三种模式的主要区别在于它们的应用场景和实现方式。策略模式适用于多个算法之间互相独立,且可以在运行时动态选择的情况;模板模式适用于算法的框架可以固定,但是算法的具体实现可能有所不同的情况;状态模式适用于将一个对象的行为与其所处的状态分离开来,使得在运行时可以动态地改变对象的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值