【设计模式——学习笔记】模板方法模式

介绍

模板方法模式(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**方法,供外部实现依赖注入逻辑,将逻辑内容交给调用方。
相关推荐
统计学小王子5 分钟前
《数学少年-从正负号到几何原本》(第一章:“刻度之上,零为分界“)--1.2 电梯与账单里的相反数字
学习·初中数学·初中数学科普·数学科普
流云鹤16 分钟前
03Java学习day(3)
java·学习
我命由我123451 小时前
棘轮效应极简理解
经验分享·学习·职场和发展·产品运营·求职招聘·职场发展·学习方法
tt5555555555551 小时前
电工证学习笔记(二)
笔记·学习·电力
wc881 小时前
微软EDGE浏览器功能学习
前端·学习·edge
hPw0eKIqD1 小时前
一步一步学习使用FireMonkey动画() 使用动画组件为窗体添加动态效果
学习
red_redemption2 小时前
自由学习记录(210)
学习
MartinYeung53 小时前
[论文学习]PACT:溯源感知能力合约——面向智能体安全的参数级溯源
人工智能·学习·安全
阿米亚波3 小时前
【C++ STL】std::unordered_multiset
开发语言·数据结构·c++·笔记·stl
Nontee3 小时前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛
java·数据库·设计模式