模板模式有两种类:1.模板类 2.具体算法类
模板类
模板类规定了算法骨架既执行的逻辑顺序,模板类中也将一些公共重用方法给提取出来,在模板类中有三种方法:
1.模板方法:规定具体方法的调用逻辑顺序,也就是说它只负责一些方法按顺序执行,而不管这些方法的具体实现。
2.公共方法:将子类中的公共方法提到了模板类中。
3.易变方法:模板类将这些易变方法交由子类去实现,这些易变方法可以是抽象的也可以是具体的
具体算法类
调用过程
代码示例
package com.model.templet;
/**
* 模板类
* 建造房子,我把分为三步
* 1.打地基 2.砌墙 3.封顶
* @author Administrator
*
*/
public abstract class TempletBuilder {
//打地基方法(公共方法)
protected void fundation(){
System.out.println("给房子打地基");
}
//砌墙(易变方法)
protected abstract void buildWall();
//封顶(易变方法)
protected abstract void buildRoot();
//建造房屋的过程(模板方法)
public void build(){
System.out.println("做房子三步曲");
fundation();
buildWall();
buildRoot();
}
}
具体类
package com.model.templet;
/**
* 建造高楼大厦类
* @author Administrator
*
*/
public class LargeBuilding extends TempletBuilder{
@Override
protected void buildWall() {
System.out.println("建造高楼大厦:用特种玻璃做墙");
}
@Override
protected void buildRoot() {
System.out.println("建造高楼大厦:用水泥板封顶");
}
}
package com.model.templet;
/**
* 建造竹林小屋类
* @author Administrator
*
*/
public class SmallBuilding extends TempletBuilder{
@Override
protected void buildWall() {
System.out.println("建造竹林小屋:用竹子做墙");
}
@Override
protected void buildRoot() {
System.out.println("建造竹林小屋:用茅草封顶");
}
}
测试类
package com.model.templet;
public class TempletModelMain {
public static void main(String[] args){
//建造高楼大厦
TempletBuilder builder = new LargeBuilding();
builder.build();
System.out.println("*****************************");
TempletBuilder builder2 = new SmallBuilding();
builder2.build();
}
}
输出结果:
做房子三步曲
给房子打地基
建造高楼大厦:用特种玻璃做墙
建造高楼大厦:用水泥板封顶
*****************************
做房子三步曲
给房子打地基
建造竹林小屋:用竹子做墙
建造竹林小屋:用茅草封顶
我个人觉得模板模式的好处:
1.将公共行为提出出来,减少代码的重用,易变的行为延迟到子类中去实现,当有什么变化的时候,我们只需更改子类就可以了,提现了”开放---封闭“原则。
2.通过模板类规定了算法的骨架,将逻辑过程封装起来,这样更加稳定和安全
=========16年6月份写的,现在21面7月份了,将以前没有补上的地方给补上======
以前做过活动,而且或作很多活动,活动类型有很多形式,例如大转盘,刮刮乐,还有那种砍价的活动,抽奖活动的流程分为1.判断抽奖人是否符合抽奖条件;2.进行中奖判断,3.分发奖品。
其中很多活动中奖判断和分发奖品这两个大的步骤是可以复用的,但是判断抽奖资格每个活动可能会有自己的具体逻辑,所以抽奖整个流程可以当成是一个模板类,其中抽奖方法就是模板方法,再模板方法中就分为1.判断抽奖人是否符合抽奖条件;2.进行中奖判断,3.分发奖品。然后在模板类中具体实现2.进行中奖判断,3.分发奖品。这两个方法,然后再到具体活动类里面实现抽奖逻辑的判断。