3.设计模式----TemplateMethod模式
模板模式,其实是一种思想,在开发中有很多地方用到模板,因为毕竟我们不可能每一个都一出一段!一个模板,填充不同,出来效果也是不一样!
准备画个时序图的,没找到工具,过几天补上!
模板模式在出现bug时候,也只需要去调整模板就好了,不需要大范围的改动代码!
Demo:
package template.method; /** * 模板模式: * 具体处理方法需要子类自己去实现,流程定义在父类中,调用时候,调用父类中得方法时候 * 出现的结果也会不一样!,这就是模板方法, * 相当于,一个相同的模板,你填充不同的东西后,出现就是不一样的! * @author zengrong * */ public abstract class AbstractDisPlay { /** * 定义三个抽象方法 */ public abstract void open(); public abstract void look(); public abstract void close(); /** * 定义一个模板: * 这模板调用了三个抽象方法,但是具体干啥,谁都不知道! */ public final void show() { open(); for (int i = 0; i < 5; i++) { look(); } close(); } }
package template.method.ch; import template.method.AbstractDisPlay; /** * 继承抽象类,第一个小伙伴继承了, * @author zengrong * */ public class StOne extends AbstractDisPlay { private Integer num; public StOne(Integer num) { this.num = num; } @Override public void open() { System.out.println("快bo网"); } @Override public void look() { System.out.println("苍老师日语教学第"+num+"部"); num++; } @Override public void close() { System.out.println("他爸爸回来了,不学了,关闭了!"); } }
package template.method.ch; import template.method.AbstractDisPlay; /** * 第二个小伙伴 * @author zengrong * */ public class StTwo extends AbstractDisPlay { private String str; public StTwo(String str) { this.str = str; } @Override public void open() { System.out.println("打开了日语网站"); } @Override public void look() { System.out.println("网站提供了"+str); } @Override public void close() { System.out.println("看了一会网站被关闭了。。。"); } }
模板模式:
1.抽取了共同的方法在父类直接在抽象类中给出具体实现。而对于有差异性的步骤,则在各自的具体类中给出实现。在父类中定义为抽象方法
2.使用模板类方法去限定制了以后会出现的算法框架
这个就是模板,算法逻辑已经固定了,
模板方法模式中的三类角色
1、具体方法(Concrete Method)
2、抽象方法(Abstract Method)
3、钩子方法(Hook Method)
举个例子:
- 泡茶:
烧开水 ==> 冲泡茶叶 ==> 倒入杯中 ==> 添加柠檬
泡咖啡:
烧开水 ==> 冲泡咖啡 ==> 倒入杯中 ==> 添加糖和牛奶
上面这一个流程:
烧开水,倒入杯中 这二个是共同的,可以抽到父类中去,
冲???添加??具体怎么做你也不知道,抽成抽象方法;
那么模板是什么?
customWantsCondiments相当于钩子,true时候,说么是和这个有关系的,
// 模板方法,决定了算法骨架。相当于TemplateMethod()方法 public void prepareBeverage() { boilWater(); brew(); pourInCup(); if (customWantsCondiments()) { addCondiments(); } }
总结:
使用模板方法模式可以将代码的公共行为提取,以达到复用的目的。
而对于特殊化的行为在子类中实现。父类的模板方法可以控制子类中的具体实现。
子类无需了解整体算法框架,只需实现自己的业务逻辑即可。
梦想一定要有,万一实现了!