这是我写二十三种设计模式第二篇文章。这个系列我将持续写下去,欢迎大家关注,点赞和收藏。
1.模板方法模式(Template Method Pattern)又叫模板模式,在一个抽象的类中,公开定义了要执行的方法的模板。它的子类可以按照需要重写方法实现。但是调用将以抽象类中定义的方法进行。
2.简单的说,模板方法模式定义一个操作中的算法骨架,将进一步实现的步骤延迟到子类中,使得子类可以不改变一个算法的结构。就可以重定义该算法的某些特定的步骤。
3.这种类型的设计模式属于行为模式。
模板方法的UML图
1.AbstractClass 抽象类,类中事项模板方法,定义了算法骨架,具体需要子类去实现,其他的抽象方法operationr2,3,4
2.ConcreteClass 事项抽象方法operationr2,3,4
模板方法来实现豆浆只做问题
编写豆浆的程序,说明如下,
模板方法的例子代码实现
1.定义模板类
/**
* 抽象类表示豆浆
*/
public abstract class SoyaMilk {
//模板方法make ,一般设置成final ,不让子类去覆盖
final void make(){
select();
if (customerChoose()){
addCondiments();
}
soak();
beat();
}
//选材料
void select(){
System.out.println("第一步,选择大豆");
}
//添加不同配料,抽象方法,具体有子类去实现
abstract void addCondiments();
//浸泡,
void soak(){
System.out.println("第三步,黄豆和配料开始浸泡 ,需要3个小时");
}
void beat(){
System.out.println("第四步 ,黄豆和配料打碎");
}
}
定义子类
public class RedBeanMilk extends SoyaMilk{
@Override
void addCondiments() {
System.out.println("加入上好的黄豆");
}
}
public class PeanutMilk extends SoyaMilk{
@Override
void addCondiments() {
System.out.println("添加上好的花生");
}
}
调用方法。
public class Client {
public static void main(String[] args) {
System.out.println("制作红豆豆浆");
SoyaMilk redBeanSoyaMilk = new RedBeanMilk();
redBeanSoyaMilk.make();
System.out.println("制作花生豆浆");
SoyaMilk peanutSoyaMilk = new PeanutMilk();
redBeanSoyaMilk.make();
}
}
模板方法模式的钩子方法
1.在模板方法的父类中,我们可以定义一个方法,他默认可以不做任何事情,子类可以视情况要不要覆盖它,该方法称为钩子
2.还是以上面的制作豆浆的例子来讲解,我们需要制作纯豆浆,不添加任何配料,我们需要用钩子方法对前面的模板进行改造。
1.给抽象类添加钩子方法。
/**
* 抽象类表示豆浆
*/
public abstract class SoyaMilk {
//模板方法make ,一般设置成final ,不让子类去覆盖
final void make(){
select();
if (customerChoose()){
addCondiments();
}
soak();
beat();
}
//选材料
void select(){
System.out.println("第一步,选择大豆");
}
//钩子方法 是否要添加配料
boolean customerChoose(){
return true;
}
//添加不同配料,抽象方法,具体有子类去实现
abstract void addCondiments();
//浸泡,
void soak(){
System.out.println("第三步,黄豆和配料开始浸泡 ,需要3个小时");
}
void beat(){
System.out.println("第四步 ,黄豆和配料打碎");
}
}
子类覆盖钩子方法
public class PurSoyaMilk extends SoyaMilk{
@Override
boolean customerChoose() {
return false;
}
@Override
void addCondiments() {
}
}
SoyaMilk puryMilk = new PurSoyaMilk();
puryMilk.make();
由此可以看出钩子方法,是返回一个布尔值,决定模板中某个方法要不要执行。
在springIOC中使用模板方法模式。有机会给这个文章深入剖析一下。
页面更新:2024-06-20
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号