今天我们了解一下模板方法模式。
这个模式,我觉得大家听的不多,但是用的特别多,稍微有点年限的程序猿应该都在经常使用这个模式(但是可能不知道, 或者是这个模式的变相)
模板,就是一个通用的东西, 平时大家在编程的时候,只要遇到相同的代码,都会提取方法出来,然后共用方法,减少代码量,
这是最基本的重构,稍微有点强迫症的人会经常这样做, 而模板方法,只是比这个稍微高级一丢丢,关注点也不一样。
平时大家做事的时候会喝点东西,比如,咖啡,茶什么的。
然后我们现在需要泡一杯咖啡或者泡一杯茶给自己润润嗓子。
大家都知道泡咖啡的步骤:1.烧开水 2.用开水冲咖啡 3.把咖啡倒进杯子 4.加点糖或者奶
package com.chris.template;
public class Coffee {
void prepareRecipe(){
boilWater();
brewCoffeeGrinds();
pourInCup();
addSugarAndMilk();
}
public void boilWater(){
System.out.println("Boiling water");
}
public void brewCoffeeGrinds(){
System.out.println("Dripping Coffee through filter");
}
public void pourInCup(){
System.out.println("Pouring into cup");
}
public void addSugarAndMilk(){
System.out.println("Adding Sugar and Milk");
}
}
同样,茶大家泡的也不会少: 1.烧开水 2.用开水浸泡茶叶 3.把茶倒进杯子 4.加点柠檬或者什么
package com.chris.template;
public class Tea {
void prepareRecipe(){
boilWater();
steepTeaBag();
pourInCup();
addLemon();
}
public void boilWater(){
System.out.println("Boiling water");
}
public void steepTeaBag(){
System.out.println("Steeping the tea");
}
public void pourInCup(){
System.out.println("Pouring into cup");
}
public void addLemon(){
System.out.println("Adding Lemon");
}
}
然后,我们可以发现,其实泡咖啡和泡茶,虽然不是一个事情,但是他的操作方法十分的相似,是不是可以提取出来些什么。。
烧开水和倒进杯子是一样的,其他的两个操作,一个是泡东西, 一个是加调料,这样看来, 其实,两个的操作是一样的。。
然后我们提取出一个超类,咖啡因饮料(其实茶中有咖啡因。。)
package com.chris.template;
public abstract class CaffeineBeverage {
final void prepareRecipe(){
boilWater();
brew();
pourInCup();
addCondiments();
}
public void boilWater(){
System.out.println("Boiling water");
}
public void pourInCup(){
System.out.println("Pouring into cup");
}
public abstract void brew();
public abstract void addCondiments();
}
这个超类中,有两个抽象方法,我们不在超类中作实现,把他的实现延迟到子类中去。
这样的话, 上面两个饮料就可以去继承这个超类了,并且实现它的抽象方法。
新的Coffee类。。
package com.chris.template.template;
import com.chris.template.CaffeineBeverage;
public class Coffee extends CaffeineBeverage{
@Override
public void brew() {
System.out.println("Dripping Coffee through filter");
}
@Override
public void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
}
新的Tea类。。
package com.chris.template.template;
import com.chris.template.CaffeineBeverage;
public class Tea extends CaffeineBeverage{
@Override
public void brew() {
System.out.println("Steeping the tea");
}
@Override
public void addCondiments() {
System.out.println("Adding Lemon");
}
}
到这里, 模板方法模式就完成了!!!
我们贴下定义: 在一个方法中定义一个算法的骨架, 而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
在demo中, 超类定义了总的泡东西的一个框架,把步骤列出来了,这样的话,他的模板方法就定住了, 而把具体的操作留给子类去实现。
这样的好处就是子类不会影响到整个的流程, 只需要负责自己这一块的实现就行了。
在平时的开发中,有很多地方会使用到模板方法模式, 这个方法比较简单,这里就不一一列举了。
有什么错误的地方还望纠正, 和大家共勉!