Java模版方法模式
1. 简介
模版方法模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的实现延迟到子类中。模版方法允许子类在不改变算法结构的情况下重写算法的某些步骤。
在软件开发中,我们经常会遇到一些问题,这些问题需要按照一定的顺序执行一系列的操作。有时候这些操作是固定的,但是每个操作的具体实现可能有所不同。这种情况下,我们就可以使用模版方法模式来实现这个算法的骨架,并且允许子类根据自己的需要来重写某些步骤的实现。
2. UML类图
下面是模版方法模式的UML类图:
@startuml
abstract class AbstractClass {
+templateMethod(): void
-concreteMethod1(): void
-concreteMethod2(): void
-abstractMethod1(): void
-abstractMethod2(): void
}
class ConcreteClass1 {
-abstractMethod1(): void
-abstractMethod2(): void
}
class ConcreteClass2 {
-abstractMethod1(): void
-abstractMethod2(): void
}
AbstractClass <|-- ConcreteClass1
AbstractClass <|-- ConcreteClass2
@enduml
在上面的类图中,AbstractClass是一个抽象类,它定义了模版方法templateMethod()和一些具体方法concreteMethod1()和concreteMethod2()。这些具体方法可以在子类中重写,但是模版方法是不可重写的。
ConcreteClass1和ConcreteClass2是两个具体的子类,它们继承AbstractClass并且实现了抽象方法abstractMethod1()和abstractMethod2()。
3. 实现步骤
下面是实现模版方法模式的步骤:
- 创建一个抽象类,定义一个模版方法和一些具体方法。
- 在抽象类中定义一些抽象方法,这些方法将在子类中实现。
- 创建具体的子类,继承抽象类并实现抽象方法。
4. 示例代码
下面是一个简单的示例代码,演示了如何使用模版方法模式来制作咖啡:
// 抽象类
abstract class Coffee {
// 模版方法,用于制作咖啡
public final void makeCoffee() {
boilWater();
brewCoffee();
pourInCup();
addCondiments();
}
// 具体方法,烧水
private void boilWater() {
System.out.println("Boiling water");
}
// 抽象方法,冲泡咖啡
protected abstract void brewCoffee();
// 具体方法,倒入杯子
private void pourInCup() {
System.out.println("Pouring into cup");
}
// 抽象方法,加入调料
protected abstract void addCondiments();
}
// 具体类,制作咖啡
class CoffeeMaker extends Coffee {
protected void brewCoffee() {
System.out.println("Brewing coffee");
}
protected void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
// 具体类,制作美式咖啡
class AmericanoMaker extends Coffee {
protected void brewCoffee() {
System.out.println("Brewing Americano");
}
protected void addCondiments() {
System.out.println("Adding nothing");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Coffee coffee = new CoffeeMaker();
coffee.makeCoffee();
Coffee americano = new AmericanoMaker();
americano.makeCoffee();
}
}
在上面的代码中,Coffee是一个抽象类,它定义了模版方法makeCoffee()和一些具体方法。makeCoffee()方法是一个模版方法,它的实现是固定的,但是具体方法brewCoffee()和addCondiments()的实现可以在子类中重写。
CoffeeMaker和AmericanoMaker是两个具体的子类,它们继承了Coffee抽象类并实现
















