介绍
模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的骨架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。这种模式的主要目的是通过将不变的行为放在父类中,而将可变的行为留给子类来实现代码复用和扩展。
案例实现
案例一
问题介绍
展示了一个制作饮料的过程,说明如下。
- 饮料的制作流程相同:煮水->酿造->倒入容器->添加调味品
- 但不同饮料的酿造喝调味品有所区别
实现
【饮料抽象类】
java
// 抽象类,定义算法的骨架
abstract class Beverage {
// 模板方法,定义制作饮料的步骤
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 具体方法,步骤1
void boilWater() {
System.out.println("Boiling water");
}
// 抽象方法,步骤2,由子类实现
abstract void brew();
// 具体方法,步骤3
void pourInCup() {
System.out.println("Pouring into cup");
}
// 抽象方法,步骤4,由子类实现
abstract void addCondiments();
}
【茶】
java
class Tea extends Beverage {
@Override
void brew() {
System.out.println("Steeping the tea");
}
@Override
void addCondiments() {
System.out.println("Adding lemon");
}
}
【咖啡】
java
class Coffee extends Beverage {
@Override
void brew() {
System.out.println("Dripping coffee through filter");
}
@Override
void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
【测试】
java
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
Beverage tea = new Tea();
tea.prepareRecipe();
Beverage coffee = new Coffee();
coffee.prepareRecipe();
}
}
案例二
问题介绍
spring中的bean的依赖注入
实现
java
public class TestMethodTemplatePattern {
public static void main(String[] args) {
MyBeanFactory beanFactory = new MyBeanFactory();
beanFactory.addBeanPostProcessor(bean -> System.out.println("解析 @Autowired"));
beanFactory.addBeanPostProcessor(bean -> System.out.println("解析 @Resource"));
beanFactory.getBean();
}
static class MyBeanFactory {
public Object getBean() {
Object bean = new Object();
System.out.println("构造:" + bean);
System.out.println("依赖注入:" + bean);
for (BeanPostProcessor processor : processors) {
processor.inject(bean);
}
System.out.println("初始化:" + bean);
return bean;
}
private List<BeanPostProcessor> processors = new ArrayList<>();
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
processors.add(beanPostProcessor);
}
}
interface BeanPostProcessor {
void inject(Object bean);
}
}
MyBeanFactory
- **
getBean
**方法:模拟了创建一个Bean的过程,包括构造、依赖注入和初始化三个步骤。这个过程使用了一个模板方法模式,将依赖注入的具体实现延迟到子类或外部实现类中。 addBeanPostProcessor
方法:允许外部添加自定义的 **BeanPostProcessor
**实现,以实现不同的依赖注入逻辑。
BeanPostProcessor
- 定义了一个 **
inject
**方法,供外部实现依赖注入逻辑,将逻辑内容交给调用方。