设计模式之 Template Method - 模板方法模式
Template Method模式也叫模板方法模式,是由GoF提出的23种设计模式中的一种。Template Method模式是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为。
如图[该图出自维基百科wikipedia.org]:
我们结合上面的定义解释一下该图。
-AbstractClass便相当于上述作为抽象类的父类,ConcreteClass便是具体的实现子类。具体的应用中,可能存在一到多个实现子类。
-AbstractClass定义了一个public的templateMethod()模板方法以及作为步骤的method1()与method2()方法。
-AbstractClass#templateMethod()方法体调用method1()与method2()方法
publicvoidtemplateMethod(){
...
this.method()1;
...
this.method()2;
...
}
-method1()与method2()方法为受保护的抽象方法(protectedabstract)。实现子类ConcreteClass需要重载该方法。
-具有统一的操作步骤或操作过程
-具有不同的操作细节
-存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同
比如有一个汽车加工厂,要组装一辆汽车;它的基本组装步骤是:
-组装车头
-组装车身
-组装车尾
-测试组装的车体
不管被组装的是吉普车,卡车,还是公交车,它们的基本组装步骤都是一样的,虽然在组装的步骤中,会有细微的差别。
通过上面的分析,我们知道,该范例满足TemplateMethod模式的应用场景所提到的条件:
-具有统一的操作步骤或操作过程:组装的步骤一样
-具有不同的操作细节:各步骤有细微的区别。例如,组装吉普车的车头需要吉普车的车头零件
-存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同。可能需要组装不同的汽车,如吉普车,卡车,公交车等等
下面我们用TemplateMethod设计模式来抽象以上组装过程。
-MakeCar:汽车组装类
-MakeJeep:吉普车组装类
源代码
publicabstractclassMakeCar{
//组装车头
abstractvoidmakeHead();
//组装车身
abstractvoidmakeBody();
//组装车尾
abstractvoidmakeTail();
//测试
abstractbooleancheckMake();
publicvoidmake(){
System.out.println("Startmakecar...");
makeHead();
makeBody();
makeTail();
if(checkMake()){
System.out.println("MakeOK.");
}else{
System.out.println("MakeFailure.");
}
}
}
//吉普车组装类
publicclassMakeJeepextendsMakeCar{
//组装车头
voidmakeHead(){
System.out.println("MakeJeephead.");
}
//组装车身
voidmakeBody(){
System.out.println("MakeJeepbody.");
}
//组装车尾
voidmakeTail(){
System.out.println("MakeJeeptail.");
}
//测试
booleancheckMake(){
returntrue;
}
}
//调用
publicclassClient{
publicstaticvoidmain(String[]args){
MakeJeepmakeJeep=newMakeJeep();
makeJeep.make();
}
}
运行并显示Client:
C:\TemplateMethod>javaClient
Startmakecar...
MakeJeephead.
MakeJeepbody.
MakeJeeptail.
MakeOK.
C:\TemplateMethod>
设计模式之FactoryMethod -工厂模式
一文中对FactoryMethod模式作了介绍,细心的读者可能会发现,这2种模式存在相似的地方:
都是在抽象父类中定义抽象方法,通过子类继承在子类中重载父类的抽象方法来实现。
但他们之间存在本质的区别:
TemplateMethod只是继承的关系,FactoryMethod除了继承之外,还有有创建的过程。
我们注意到,在FactoryMethod模式中,被定义的抽象方法创建了产品对象,也就是说,在FactoryMethod模式中,除了具有继承关系的抽象父类工厂与具体的子类工厂之外,还有具有继承关系的产品类,并且工厂类与产品类之间存在创建与被创建的关系;而TemplateMethod模式则不存在此关系。