因为最近在学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 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()方法.
这就是模板方法,定义一个算法框架,包含一些自己实现或是交由子类实现的算法.保证代码复用的情况下,又具有相当的弹性,方便扩展
和维护.