今天我们学习一下模板方法模式,该模式特别简单,别单例还简单学习起来很容易,而且很快会掌握该技巧并应用到实际的开发中,现在我们一下看一下模板方法模式。
模板方法模式的定义
模板方法模式是定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不可变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式简单实现
我们再来模仿一下做面的过程,哈哈,没办法,身为西府人面食是我的钟爱,但是一直南漂万分想念,就用代码来做几碗面让我以及和我一样的人意淫一下,正题:做面大家都知道有以下几个步骤:1.和面,2.切面,3.煮面,4.调面,好了,一般面食的做法就这些,我最爱的削筋面也是。包括扯面、麻什也是。我们来做个削筋面和扯面,上面说了做着两种面有相同的4个步骤,而且顺序也都是相同的,所以依次执行这四个方法可以在抽象类中实现,然后这四个步骤,不同的面试有不同的做法,所以为两个具体类,来实现这四个步骤,因此有以下几个类:
AbstractProcNoodels 抽象的模板(定义了做面的四个步骤抽象的方法,实现做面的方法顺序调用四个步骤一气呵成)
CheNoodles 具体类(扯面,实现抽象模板)
XiaoJinNoodles 具体类(削筋,实现抽象模板)
下来看看代码:
1.抽象模板
package design.template;
/**
* 抽象模板
* @author yanwenfei
*
*/
public abstract class AbstractProcNoodels {
//和面(基本方法)
public abstract void huoNoodles();
//切面面(基本方法)
public abstract void cutNoodles();
//煮面(基本方法)
public abstract void zhuNoodles();
//调面(基本方法)
public abstract void tiaoNoodles();
//模板方法
public void submitNoodles(){
this.huoNoodles();//和面
this.cutNoodles();//切面
this.zhuNoodles();//煮面
this.tiaoNoodles();//调面
System.out.println("香喷喷的面出锅了,各位爷用餐了。。。");
}
}
2.削筋面的做法
package design.template;
//削筋面
public class XiaoJinNoodles extends AbstractProcNoodels {
@Override
public void huoNoodles() {
System.out.println("削筋面:我在和面,越硬越劲道...");
}
@Override
public void cutNoodles() {
System.out.println("削筋面:我在切面,越细越好吃...");
}
@Override
public void zhuNoodles() {
System.out.println("削筋面:我在煮面,煎三次刚好,少了没熟,多了太软...");
}
@Override
public void tiaoNoodles() {
System.out.println("削筋面:盐、西府凝香醋、油辣子...");
}
}
3.扯面的做法
package design.template;
public class CheNoodles extends AbstractProcNoodels {
@Override
public void huoNoodles() {
System.out.println("扯面:我在和面,不能太硬要不拉不开...");
}
@Override
public void cutNoodles() {
System.out.println("扯面:我在切面,然后再扯开,越长越薄越好吃...");
}
@Override
public void zhuNoodles() {
System.out.println("扯面:我在煮面,扯面太软,煎两次刚好...");
}
@Override
public void tiaoNoodles() {
System.out.println("扯面:盐、西府凝香醋、油泼辣子...");
}
}
代码写完了,现在就来叫面了
package design.template;
public class TestMain {
public static void main(String[] args) {
//来一碗扯面
AbstractProcNoodels noodles = new CheNoodles();
noodles.submitNoodles();
//来一碗削筋面
noodles = new XiaoJinNoodles();
noodles.submitNoodles();
}
}
执行结果:
扯面:我在和面,不能太硬要不拉不开...
扯面:我在切面,然后再扯开,越长越薄越好吃...
扯面:我在煮面,扯面太软,煎两次刚好...
扯面:盐、西府凝香醋、油泼辣子...
香喷喷的面出锅了,各位爷用餐了。。。
削筋面:我在和面,越硬越劲道...
削筋面:我在切面,越细越好吃...
削筋面:我在煮面,煎三次刚好,少了没熟,多了太软...
削筋面:盐、西府凝香醋、油辣子...
香喷喷的面出锅了,各位爷用餐了。。。
到这来,模板方法模式已经介绍完了,没错就是这么简单
当然也可以做一些扩展,因为我们经常吃大盘鸡的时候经常会叫一些白面,就是煮好不调的,如果用上面扯面的做法,那肯定不行了,得做一下修改,代码我就不贴了我简单说一下算了
在抽象类中加一个变量 比如 isTiao 和 setIsTiao(boolean b) 在测试类中设置noodles.setIsTiao(false) 赋值给抽象类中的 isTiao 然后在公用的方法中加个判断 if (isTiao == true) this.tiaoNoodles() 这样就ok了,也不影响之前的功能,
为了防止恶意操作,模板方法模式可以加上final关键字,不允许被覆盖
优点,应用我就不说了,我想大家肯定自己已经脑补了很多场景了。。。