设计模式之模板方法模式
模板方法模式简介
模板方法模式(Template Method Pattern),二十三中设计模式之一,也是一种比较常用的设计模式。模板方法模式,顾名思义,主要就是提供一个模板的,无论是在现实生活中还是在开发过程中,总会遇到这样的情况,完成某一项工作的时候,其大体的步骤是固定不变的,但是其中具体各个步骤的操作是根据实际情况来确定,这个时候,为了防止步骤出现错误,就可以使用模板方法模式,将整体的流程确定下来,然后将具体需要完成的内容留空,根据具体的情况再进行完成,比如说,我们去医院看病,需要的大概流程如下:
1. 挂号
2. 向医生反馈具体的病情
3. 医生根据具体情况开药
4. 交医药费
5. 取药
这其中的流程是固定的,但是第2点,第3点是要根据具体情况来确定的。在软件开发过程中,有一些过程也是如此的,使用者可以根据实际情况进行相应的实现,但是,我们不希望这个过程被乱,这时候,模板方法就起到很好的作用了。
模板方法的具体实现
接下来我们采用上面到医院看病的例子来具体看下模板方法的实现。
//这里需要使用抽象类而不是接口,有部分方法是需要实现的
public abstract class SeeADoctor {
private void registered(){
System.out.println("挂号...");
}
// 这里最好是将抽象方法声明为protected,仅供子类使用
// 当然,这里可以根据情况有多个抽象的方法
protected abstract void talkWithDoctor();
private void checkOut(){
System.out.println("付款...");
}
private void takeMedicine(){
System.out.println("取药...");
}
// 处理流程,将其声明为final,避免流程被修改
public final void proceed(){
registered();
talkWithDoctor();
checkOut();
takeMedicine();
}
}
class SeeSkinDoctor extends SeeADoctor{
@Override
protected void talkWithDoctor() {
System.out.println("与皮肤科医生交谈....");
}
}
class SeeMentalDoctor extends SeeADoctor{
@Override
protected void talkWithDoctor() {
System.out.println("与精神科医生交谈....");
}
}
// 对应的测试类
class Client{
public static void main(String[] args) {
SeeADoctor seeADoctor = new SeeSkinDoctor();
seeADoctor.proceed();
seeADoctor = new SeeMentalDoctor();
seeADoctor.proceed();
}
}
总结
模板方法模式主要是用于希望使用者按照一定的流程、过程来完成某个事情,同时使用者可以根据需要进行部分或者全部但不包括流程的定制此类情况,既能够保证按照一定的流程来完成某个事情,又能够让使用者根据需要进行定制。