模板方法模式是一个相当简单的模式.
可能1个完全不懂设计模式的程序猿在不知不觉间也多次使用了它.
我们先看看定义.
一.模板模式(TemplateMethod) 的定义.
所谓模板方法模式, 就是定义1个操作中的算法的骨架, 而将一些步骤延迟到子类中. 模板方法使得子类可以不改变1个算法的结构即可重定义该算法的某些特定步骤.
看了这么多设计模式的定义, 这次终于是写的比较通俗易懂了.
简单来讲,
模板方法模式把1个算法分成若干个步骤, 但是把这些步骤方法设为抽象方法, 让它们在子类中重写.
这就有1个前提, 这个算法必须能严格分割成若干个步骤哦.
二. 洗衣机洗衣服的例子.
我们还是举个例子来讲.
洗衣机类 WashingMachine:
洗衣机最重要的方法就是洗衣服了(washing).
这个过程可以分成三个步骤
1. 进水 (inflow)
2. 清洗 (cleanning)
3. 脱水 (drying)
各种不同的洗衣机可能有不同的进水方法, 清洗方法 以及 脱水方法.
但是基本上都是可以分成上述三个步骤的.
所以我们可以把代码写成这样.
public abstract class WashingMachine {
public abstract void inflow();
public abstract void cleaning();
public abstract void drying();
public void washing(){
this.inflow();
this.cleaning();
this.drying();
}
}
上面的代码把三个子步骤写成抽象方法,
而最终的washing()是非抽象方法.
两个洗衣机子类: Siemens 和 Panasonic
两个洗衣机的子类重写了抽象类的三个抽象方法:
但是不重写综合算法.
public class Siemens extends WashingMachine {
@Override
public void inflow() {
// TODO Auto-generated method stub
System.out.println("SIEMENS inflow.");
}
@Override
public void cleaning() {
// TODO Auto-generated method stub
System.out.println("SIEMENS cleaning.");
}
@Override
public void drying() {
// TODO Auto-generated method stub
System.out.println("SIEMENS cleaning.");
}
}
public class Panasonic extends WashingMachine {
@Override
public void inflow() {
// TODO Auto-generated method stub
System.out.println("Panasonic inflow.");
}
@Override
public void cleaning() {
// TODO Auto-generated method stub
System.out.println("Panasonic cleaning.");
}
@Override
public void drying() {
// TODO Auto-generated method stub
System.out.println("Panasonic cleaning.");
}
}
客户端代码:
WashingMachine wm = new Siemens();
wm.washing();
wm = new Panasonic();
wm.washing();
输出:
SIEMENS inflow.
SIEMENS cleaning.
SIEMENS cleaning.
Panasonic inflow.
Panasonic cleaning.
Panasonic cleaning.
可以看出, 上面连个子类, 虽然它们的步骤是完全不同的, 但是它们洗衣服方法的骨架是一样的.
UML:
三,小结
这个模式好易明, 无非就是把1个复杂算法拆解, 然后让不同的子类自己去实现各个步骤.
它只适用于能分解步骤的算法.
子类一般只重写步骤方法, 不重写综合骨架,
一旦子类重写了骨架, 那么它就不是模板方法(TemplateMethod)模式了.