概述
策略模式与模板模式在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语法规则的就行,因此,这里的不同方案就对应一种策略。
总结策略模式的特点:是针对同一个算法,有不同的实现。各个策略完成的功能是重复的,同一时间,只能选择其中的一种,即互斥的。