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()。这些具体方法可以在子类中重写,但是模版方法是不可重写的。

ConcreteClass1ConcreteClass2是两个具体的子类,它们继承AbstractClass并且实现了抽象方法abstractMethod1()abstractMethod2()

3. 实现步骤

下面是实现模版方法模式的步骤:

  1. 创建一个抽象类,定义一个模版方法和一些具体方法。
  2. 在抽象类中定义一些抽象方法,这些方法将在子类中实现。
  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()的实现可以在子类中重写。

CoffeeMakerAmericanoMaker是两个具体的子类,它们继承了Coffee抽象类并实现