模板模式
 
 
一、基本介绍
 
- 模式方法模式,又叫模板模式,在一个抽象类公开定义了执行它的方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
- 模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。
- 模板方法模式属于行为型模式。
二、原理类图
 

 
- AbstractClass抽象类,类中实现了模板方法,定义了算法的骨架,具体子类需要去实现其他的抽象方法。operation2,3,4
- ConcreteClass实现抽象方法operation2,3,4 以完成算法中的特定子类的相关步骤。
三、豆浆制作
 
1. 原理类图
 

 
2. 代码实现
 
- 抽象类,表示豆浆
public abstract class SoyaMilk {
    
    public final void make(){
        select();
        addCondiment();
        soak();
        beat();
    }
    
    void select(){
        System.out.println("第一步,选择黄豆");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    abstract void addCondiment();
    
    void soak(){
        System.out.println("第三步,浸泡黄豆和配料。");
    }
    
    void beat(){
        System.out.println("第四步,打豆浆");
    }
}
 
- RedBeanSoyaMilk
public class RedBeanSoyaMilk extends SoyaMilk{
    @Override
    void addCondiment() {
        System.out.println("第二步,添加红豆");
    }
}
 
- PeanutSoyaMilk
public class PeanutSoyaMilk extends SoyaMilk {
    @Override
    void addCondiment() {
        System.out.println("第二步,加入花生");
    }
}
 
- Client
public class Client {
    public static void main(String[] args) {
        
        SoyaMilk soyaMilk = new RedBeanSoyaMilk();
        long startTime = System.currentTimeMillis(); 
        soyaMilk.make();
        long endTime = System.currentTimeMillis(); 
        System.out.println("制作红豆豆浆,共花费时间" + (endTime - startTime));
    }
}
 

 
四、模板方法模式的注意事项和细节
 
- 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改.需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改。
- 实现了最大化代码复用.父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
- 即统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤实现。
- 不足:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大。
- 一般模板方法都加上final关键字,防止子类重写模板方法。
- 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同,但其个别步骤在实现时,可能不同,通常考虑用模板方法模式来处理。