模板模式
模板模式
定义
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
demo
比如做饮料(泡茶 or 冲咖啡)
1. 定义模板父类:BeverageTemplate
public abstract class BeverageTemplate {
// 模板方法:固定流程,不允许子类更改
public final void prepareBeverage() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 这些步骤有默认实现
protected void boilWater() {
System.out.println("Boiling water...");
}
protected void pourInCup() {
System.out.println("Pouring into cup...");
}
// 抽象方法,交给子类实现
protected abstract void brew();
protected abstract void addCondiments();
}
2. 写两个具体子类:Tea 和 Coffee
import org.springframework.stereotype.Component;
@Component
public class Tea extends BeverageTemplate {
@Override
protected void brew() {
System.out.println("Steeping the tea...");
}
@Override
protected void addCondiments() {
System.out.println("Adding lemon...");
}
}
import org.springframework.stereotype.Component;
@Component
public class Coffee extends BeverageTemplate {
@Override
protected void brew() {
System.out.println("Dripping coffee through filter...");
}
@Override
protected void addCondiments() {
System.out.println("Adding sugar and milk...");
}
}
3. 测试
import org.example.design_pattern.Template.Coffee;
import org.example.design_pattern.Template.Tea;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DesignPatternApplicationTests {
@Autowired
private Tea tea;
@Autowired
private Coffee coffee;
@Test
public void testProxy() {
System.out.println("准备茶:");
tea.prepareBeverage();
System.out.println("\n准备咖啡:");
coffee.prepareBeverage();
}
}
4. 输出
准备茶:
Boiling water...
Steeping the tea...
Pouring into cup...
Adding lemon...
准备咖啡:
Boiling water...
Dripping coffee through filter...
Pouring into cup...
Adding sugar and milk...
Spring中的示例
- JdbcTemplate(封装了JDBC的繁琐流程(连接、异常处理、资源清理),用户只需关注SQL和结果映射。)
- RestTemplate(封装HTTP请求处理,如状态码检查、数据转换。)
- TransactionTemplate(管理事务的提交和回滚,用户只需编写业务逻辑。)