因为最近在学Django,所以对于模板这个概念还是比较熟悉的.Django的MTV模式,模板(Template)是其特色之一,我们可以对比着看.
以下是我的基础模板base.html文件
<span style="font-size:14px;"><!DOCTYPE html>
<html>
{% load staticfiles %}
<head lang="en">
<meta charset="UTF-8">
<title>{% block title %}{% endblock%}</title>
{% block js_import %} {% endblock%}
{% block css_import %} {% endblock%}
</head>
<body>
<div>
<div>
{% block head %}
{% endblock %}
<div class="body">
<div class="left">
{% block left %} {% endblock %}
</div>
<div class="middle">
{% include "navigator.html" %}
{% block middle %}{% endblock %}
</div>
{% block right %}
<div class="right">
</div>
{% endblock %}
</div>
<div class="footer">
{% block footer %}
2013~2014 @copyright owned by xxx
{% endblock %}
</div>
</div>
</div>
{% block footer_import_js %}{% endblock %}
{% block footer_js %}{% endblock %}
</body>
</html></span>
整个文件我们可以看成是模板模式中的父类,定义了一些算法框架(即这里的{%block%}),而每个{%block%}段就是封装的具体的算法,
这些算法可能是由父类实现的,也可能延迟让子类负责实现.
比如这里的{%block footer % },就是父类实现的页脚,要求子模板必须都继承这个页脚.而其余的像是{%block title%}{%block right%}等
就是留待子模板来具体实现的,这样既产生了一个框架,规范,实现了代码的复用,又给予了子类充分的能动性.
需要注意的是,在模板模式里有个钩子(hook)的概念,在我看来,这个hook算是一个预留的平时不起作用的(方法体是空的)方法,如果需
要用到的话可以由子类去重写.起到出其不意的作用.看一下下面这个例子:
public abstract class Parent{
public void abstractBusiness()
{
collectData();//父类实现的 收集数据
dealWithData();//子类实现的 业务处理数据
beforeSaveData();// hook方法1,方法体空
saveData();// 父类实现的 保存数据
afterSaveData();// hook方法2,方法体空
}
}
一般情况下,收集数据和保存数据的公用方法由父类来实现,具体的业务处理方法交由子类来具体实现.那么如果现在要求保存数据之
前要求对数据的有效性进行校验,beforeSaveData()方法就派上用场了,子类重写一下这个方法就可以了,如果要求数据保存之后还要发
送给其他的接口,那么再重写一下afterSaveData()方法.
这就是模板方法,定义一个算法框架,包含一些自己实现或是交由子类实现的算法.保证代码复用的情况下,又具有相当的弹性,方便扩展
和维护.