模版设计模式

[b]定义[/b]:在一个方法中定义一个算法骨架,而将一些步骤延伸到子类中。(其本质:把可变和不可变进行分类。可变部分延伸到子类来完成,不变部分交给父类定义成骨架)

[b]优点[/b]:
1)可以使的子类可以在不改变算法骨架的情况下,重新定义算法中的某些步骤。
2)模版方法通过把不变的部分搬移到超类,去除了子类中的重复代码。
3)子类实现算法的特定步骤,有利于算法的扩展。
4) 通过一个父类调用子类实现的操作,通过子类扩展新的行为,符合“开放-封闭原则”。
[b]缺点:[/b]每一个不同的实现都需要一个子类来完成,这个会导致子类个数的增加,设计更抽象。


[b]使用场景[/b]:
1)在某些算法中,有了相同的方法,造成的代码重复。
2)控制子类扩展,子类必须遵守算法规则。


场景:

冲茶水: 冲咖啡:
1) 洗杯子 1)洗杯子
2) 烧开水 2)烧开水
3) 加料(加茶叶) 3)加料(加咖啡)
4) 烫材料(沸水烫茶叶)4)烫材料(温水冲咖啡)

分析:
[b]不变部分[/b]:冲咖啡和冲茶水的步骤是一样的,抽象部分(不变部分:1洗杯子、2烧开水、3加料、4烫材料)
[b]可变部分[/b]:加料和烫料是可变部分。因此此部分需要交给子类扩展延伸,保证了代码在骨架上的重用。

1、定义模版(冲水模版)
public abstract class  FlushWaterTemple{
//定义算法骨架
public void flushWater(){
wash();
boilWater();
addMaterial();
finshedWater();
}
public void wash(){
System.out.println("洗杯子");
}
public void boilWater(){
System.out.println("烧水");
}

//加料
public abstract void addMaterial();
//烫材料
public abstract void finshedWater();

}

}

2、冲茶叶
public class FlushTea extends FlushWaterTemple{
//加料
public void addMaterial(){
System.out.println("加点茶叶");
}
//烫材料
public void finshedWater(){
System.out.println("用沸水烫茶叶");
}

}

2、冲咖啡
public class FlushCoffee extends FlushWaterTemple{
//加料
public void addMaterial(){
System.out.println("加点咖啡");
}
//烫材料
public void finshedWater(){
System.out.println("用温水烫咖啡");
}

}


测试
public class Test{

public static void main(){
FlushWaterTemple tmp = new FlushCoffee();
tmp.flushWater();
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的模板设计模式是一种行为型设计模式,它允许我们定义一个算法的骨架,但允许子类为其中的一些步骤提供具体的实现。 模板设计模式由两个主要组件组成: 1. 抽象类(Abstract Class):它定义了一个模板方法,该方法提供了算法的骨架。它可以包含一个或多个抽象方法,这些方法由子类来实现。 2. 具体类(Concrete Class):它是抽象类的子类,负责实现抽象方法。 以下是一个示例代码来说明模板设计模式的用法: ```java public abstract class AbstractClass { // 模板方法 public final void templateMethod() { // 步骤一 stepOne(); // 步骤二 stepTwo(); // 步骤三 stepThree(); } // 抽象方法,由子类实现 protected abstract void stepOne(); protected abstract void stepTwo(); // 钩子方法,子类可以选择性地覆盖 protected void stepThree() { // 默认实现 } } public class ConcreteClass extends AbstractClass { @Override protected void stepOne() { // 具体实现步骤一 } @Override protected void stepTwo() { // 具体实现步骤二 } } ``` 在上面的示例中,`AbstractClass` 是抽象类,它定义了一个名为 `templateMethod()` 的模板方法,并声明了三个抽象方法 `stepOne()`、`stepTwo()` 和 `stepThree()`。`ConcreteClass` 是具体类,它继承了 `AbstractClass` 并实现了抽象方法。 通过使用模板设计模式,我们可以在抽象类中定义算法的骨架,而具体的实现可以由子类来完成。这种设计模式使得代码重用和扩展变得更加容易。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值