Java设计模式 - 模板方法模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 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来对当前程序体状态进行判断。

猜你喜欢

转载自blog.csdn.net/R812656252/article/details/84334837