版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/R812656252/article/details/84334837
Java设计模式 - 模板方法模式
定义一个算法的骨架,并将一些步骤通过子类表达。
UML图示
要点
1. 定义一个算法的骨架 - 建立一个抽象类
2. 将一些步骤通过子类表达 - 子类继承抽象类 赋予不同实现
模板方法应用实例
模板方法适用于那种总体处理流程不变,但是处理细节可能存在变化的实例。
例如,咖啡店制作咖啡时大致可以抽象成如下几个步骤:研磨咖啡豆 - 冲泡咖啡 - 加配料 - 加糖 - 拿给顾客。当顾客需要正常拿铁时,会在冲泡好咖啡后,加入纯牛奶。而另一个客户需要豆奶拿铁时,则会加入豆奶拿铁。利用模板方法模式简单模拟这一过程。
-CoffeeOrder.java
public abstract class CoffeeOrder {
public void makingCoffee(){
GrindingCoffee();
BrewingCoffee();
AddIngredients();
AddSuger();
PassToCustormer();
}
public abstract void GrindingCoffee();
public abstract void BrewingCoffee();
public abstract void AddIngredients();
public void AddSuger(){
System.out.println("Adding suger for a latte");
}
public abstract void PassToCustormer();
}
- LatteCoffeeOrder.java
public class LatteCoffeeOrder extends CoffeeOrder {
public void GrindingCoffee() {
System.out.println("GrindingCoffee for a latte");
}
public void BrewingCoffee() {
System.out.println("BrewingCoffee for a latte");
}
public void AddIngredients() {
System.out.println("Add pure milk for a latte");
}
public void PassToCustormer() {
System.out.println("Passing a latte for custormer");
}
}
-SoyLatteCoffeeOrder.java
public class SoyLatteCoffeeOrder extends CoffeeOrder {
public void GrindingCoffee() {
System.out.println("GrindingCoffee for a soy latte");
}
public void BrewingCoffee() {
System.out.println("BrewingCoffee for a soy latte");
}
public void AddIngredients() {
System.out.println("Add pure milk for a soy latte");
}
public void PassToCustormer() {
System.out.println("Passing a soy latte for custormer");
}
}
- Application.java
public class Application {
public static void main(String[] args){
CoffeeOrder order1;
CoffeeOrder order2;
order1 = new LatteCoffeeOrder();
order2 = new SoyLatteCoffeeOrder();
order1.makingCoffee();
order2.makingCoffee();
}
}
钩子方法
抽象类中定义的具体方法,给出了空实现或者默认实现,并且允许子类重写(没用final)。有时候钩子方法会作为flag来对当前程序体状态进行判断。