您的位置:首页 > 其它

设计模式之模板方法模式(Template)

2012-12-12 09:41 357 查看
这应该是较为简单的一个设计模式,其实就是充分发挥了Java的抽象特性。让抽象方法可以通过继承该抽象类的类进行具体实现。回归模式本身,顾名思义:模版方法,因此其局限适用于类方法中。下面是一篇不错的博文,原本是以C++作为例子进行阐述的,这里将其更改为Java。

转文地址:/article/4950130.html

正文:

提到“模板”不知道别人想到的是什么,我想到的是可复用,与此提供同时可复用又是面向对象编程和设计模式要达到的目的。所以模板方法模式作为一种设计模式也自然是理所应当的啦。其实,模板方法模式是一种比较简单的设计模式,看看具体的吧:

1.初识模板方法模式

  读了这么多年书,大家或多或少都遇到过这样的情况吧:老师在黑板上写了一些题,让学生记下去,然后写答案在交上来。(还记得那个时候我近视看不清黑板的痛苦啊,那个时候我只能别人抄完了,我在照他们抄。)其实这就是模板方法模式能够解决的问题了,分析一下我们便知道大家每个人抄的题应该都是一样的吧,只有答案可能不一样,要是大家抄的选择题,那么不一样的东西就只有一个答案,区别可能就是A,B,C,D。可是每个人却都要抄一遍题,要是遇到一个我这样的近视,还可能把题抄错了。这就体现出来模板方法模式的重要性了,建立一个模板类,类中包括:模板方法和子类实现的方法。这里模板方法为题目+答案(调用类中的答案方法),子类实现的方法就是答案方法,这样做就避免了每个子类总都包含题目,使得每个子类中只需要包含答案。说恐怕怎么说也不直观,还是看看代码实现吧。

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2.模板方法模式应用举例

看看具体的模板类和具体实现是怎么实现的吧:

public abstract class TestpaperTemplate {
public void templateMethod(){
question1();
question2();
answer1();
answer2();
}
public void question1(){
System.out.println("question1..");
}
public void question2(){
System.out.println("question2..");
}

public abstract void answer1();
public abstract void answer2();
}
public class StudentA extends TestpaperTemplate {
@Override
public void answer1() {
System.out.println("StudentA answer1: A");
}
@Override
public void answer2() {
System.out.println("StudentA answer2: B");
}
}
public class StudentB extends TestpaperTemplate {
@Override
public void answer1() {
System.out.println("StudentB answer1: B");
}
@Override
public void answer2() {
System.out.println("StudentB answer2: B");
}
}


这样一来,每个学生只需要写自己的答案就好了,避免抄题这种无用功了。

3.使用模板方法模式的场合和好处

模板方法模式是通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势的。也就提供了一个很好的代码复用平台。如果以后遇到这种情况:有一个过程需要执行,这个过程包括一系列步骤,整个过程从高层次看是一样的,但是每个步骤的具体细节不一样,这时我们就可以考虑这种模板方法模式了。即当不变的行为和可变的行为在类中混在一起的时候,不变的行为就会在子类中重复出现,这是通过模板方法模式把这些行为搬移到单一的地方实现(超类),而把不同的部分在子类实现,这就使子类摆脱了重复的不变行为的困扰。

应用实例:HttpServlet类提供了一个service()方法.这个方法调用了一个或是多个do方法,完成对客户端发起的请求的处理,这些do方法则是由具体的HttpServlet类提供的.那么这里的service()方法就是一个摸板方法.




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: