模板设计模式
- 定义
1、模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
2、简单说,模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤,这种类型的设计模式属于行为型模式。
模板方法模式
1、类图
2、模板方法
public final void cooking(BigDecimal money) {
Preconditions.checkArgument(money.doubleValue() > 0.0d , "enter an amount greater than 0");
ReentrantLock lock = new ReentrantLock();
Boolean flag;
lock.lock();
try {
String name = "Crucian carp";
int size = 6;
flag = buyFish(money , size , name);
if (flag) {
Fish fish = FishListHolder.fishMap.get(name);
cleanFish(fish , size);
sideDishes(name);
spices(name);
onPot(name);
}
}finally {
lock.unlock();
}
}
1、上面的 cooking
方法就是我们定义的模板方法,用来定义统一的执行流程,在模板类中我们可以定义相关的抽象方法并通过子类去加以实现,完成我们具体的方法的填充。
2、模板方法中包括 buyFish
、cleanFish
、sideDishes
、spices
、onPot
等抽象方法
模板类具体实现
public class SteamedCookFish extends CookFish{
@Override
protected Boolean buyFish(BigDecimal money, int size, String name) {
Fish fish = FishListHolder.fishMap.get(name);
BigDecimal paymentAmount = BigDecimal.valueOf(size * fish.getUnitPrice());
if (money.doubleValue() >= paymentAmount.doubleValue()) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
@Override
protected void cleanFish(Fish fish , int size) {
System.out.println(String.format("Careful cleaning of [{%s}] pounds of [{%s}] fish" , size , fish.getName()));
}
@Override
protected void sideDishes(String name) {
System.out.println(String.format("Prepare the side dishes for the [{%s}] fish" , name));
}
@Override
protected void spices(String name) {
System.out.println(String.format("Prepare the seasoning for the [{%s}] fish" , name));
}
@Override
protected void onPot(String name) {
System.out.println(String.format("Put the [{%s}] fish and seasoning into the pot" , name));
}
}
1、到这里我们就完成了基本的实现了模板设计模式,本设计模式主要对烹饪 cooking
这个方法进行具体的拆分,从而达到流程控制的作用。
测试
- 编写具体的测试类来进行我们模板方法的测试
public class TemplatePatterns {
public static void main(String[] args) {
CookFish cookFish = new SteamedCookFish();
cookFish.cooking(new BigDecimal(100));
}
}
1、通过上面步骤我们就完成了模板方法的编写
注意事项
1、模板类需要定义成抽象类 (abstract),具体的模板方法需要定义成 final 方法防止子类重写,分解的子类需要定义成 abstract
方法以便于子类进行扩充和实现