一:楔子
最近一直在看设计模式,但是考虑到设计模式这个东西,没有很多的应用很容易忘记,因此希望结合实际已有的应用来强化自己对设计模式的理解。先把我映像比较深的几个模式写出来。第一期就是模版方法设计模式,也算笃行我对自己的要求。
参考书目《设计模式-java》结城浩 著,博硕文化 译
二:模版方法设计模式(Template Method Pattern)概要
一句话描述:定义一个操作中算法的骨架,而将这些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。算法的整个流程不会改变,改变的只是实现的细节。
由模板模式的可以很明显看出抽象类的作用和接口设计的区别,接口中的方法是全部不实现的,抽象类中可以不是抽象的方法。而这个实现的方法正是模版方法模式的核心所在。
三:
举例说明:抽象类,
public abstract class AbstractDisplay {
//子类进行不同的实现
public abstract void open();
public abstract void print();
public abstract void close();
public final void dsplay(){//相当于某个算法的骨架
open();
for(int i=0;i<5;i++){
print();
}
close();
}
}
不同的实现类,下面我们举两个例子,子类虽然抽象方法实现不同,但是整个算法的骨架都是按照父类规定好的实现。
具体类1:
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
super();
this.ch = ch;
}
@Override
public void open() {
// TODO Auto-generated method stub
System.out.print("<<");
}
@Override
public void print() {
// TODO Auto-generated method stub
System.out.print(ch);
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println(">>");
}
}
具体类2:
public class StringDisplay extends AbstractDisplay {
private String string;
private int width;
public StringDisplay(String string) {
super();
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void open() {
// TODO Auto-generated method stub
printLine();
}
private void printLine() {
// TODO Auto-generated method stub
System.out.print("+");
for(int i=0;i<width;i++){
System.out.print("-");
}
System.out.println("+");
}
@Override
public void print() {
// TODO Auto-generated method stub
System.out.println("|"+string+"|");
}
@Override
public void close() {
// TODO Auto-generated method stub
printLine();
}
}
观看效果:
public static void main(String[] args) {
// TODO Auto-generated method stub
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("Hello world.");
AbstractDisplay d3 = new StringDisplay("您 好");
d1.dsplay();
d2.dsplay();
d3.dsplay();
String str1 = "str";
System.out.println(str1.length());
}
四:一些学习
String str2 = "中国";
System.out.println(str2.length());
System.out.println(str2.getBytes().length);
体会其中的一些区别
五:模版方法模式的应用
一个普通的servlert类,我们去继承的HttpServlet类中有五个方法,init(),service(),doGet(),doPost(),destry()方法,我们自己写的servlet中要实现或者重写里面的方法,但是里面的service方法是不能重写的。当我们的参数请求到servlet类中,会到父类中的service方法中判断method是Post还是Get方式,
public final void service(){
if(method.equals("get"))
{doGet()}
else
{doPost()}
}
public abstract void doGet(){}
Public abstract void doPost(){}
所以要求在HttpServlet类中有doPost和doGet方法,但是这两个方法的执行逻辑是不确定的,这时可以在HttpServlet里面定义doGet和doPost抽象类,供子类继承实现,或者定义其方法,让子类去重写。service()方法被称为模板法,去调用子类的实现方法doGet和doPost方法。
在实际中我们一般继承HttpServlet或者GenericServlet,我们实现其中的doGet,以及doPost方法。