设计模式系列之模板方法模式

模板方法模式是一种设计模式,它定义了算法的骨架,允许子类在不改变整体结构的情况下重定义某些步骤。通过创建PPT模板类,其中的demonstration()方法作为模板方法规定了workSummary()和nextPlanning()的执行顺序,子类Person1和Person2继承并实现这两个方法,实现了各自不同的内容。这种模式提高了代码复用,但也可能导致类数量增加和维护难度上升。适用于逻辑和步骤一致但具体实现不同的场景。

1 定义

模板方法模式定义了一个算法的步骤,并允许子类为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。

《百度百科》

模板方法模式,首先从名字看,关键点就是模板,模板很好理解,就是定义好一个模板,然后其他需要用到这个模板的地方根据定义好的模板做自己的实现。

例如HR发给你一个转正答辩的PPT模板,在PPT模板中已经划分好了工作总结、下阶段职业规划等大纲,且规定必须按照这个大纲来做PPT,那么这个PPT就是模板,而每个人在不改变大纲的情况下去写不同的内容,这个就是子类为一个或多个步骤提供其实践方式。

2 示例

2.1 类图

在这里插入图片描述

PPT做为模板类,在该模板类中有demonstration()、workSummary()和nextPlanning()三个方法,其中demonstration()为模板方法,模板方法在模板类中默认实现且不可被继承,其中定义了模板的行为,例如在本例的模板方法中规定了workSummary()和nextPlanning()的执行顺序,和其他相同的操作。workSummary()和nextPlanning()则是需要子类自己实现的抽象方法。

2.2 代码实现:

首先先定义出PPT模板和模板方法

public abstract class PPT {
	// PPT演示
	public final void demonstration(){
		System.out.println("开始演示");		// 相同的前置操作
        // 模板的流程,先执行workSummary再执行nextPlanning
		workSummary();
		nextPlanning();
		System.out.println("演示结束");		// 相同的后置操作
	}
	// 工作总结
	public abstract void workSummary();
	// 下阶段工作规划
	public abstract void nextPlanning();
}

其中定义出的PPT模板类使用abstract修饰为抽象类,并且类中的模板方法demonstration()使用final修饰,这样做的目的是防止子类的恶意修改。而需要子类具体实现的方法则使用abstract修饰,这样做的目的是强制子类必须实现。

然后根据PPT模板实现不同的子类:

子类Person1

public class Person1PPT extends PPT{
	@Override
	public void workSummary() {
		System.out.println("Person1的总结");
	}

	@Override
	public void nextPlanning() {
		System.out.println("Person1的规划");
	}
}

子类Person2

public class Person2PPT extends PPT{
	@Override
	public void workSummary() {
		System.out.println("Person2的总结");
	}

	@Override
	public void nextPlanning() {
		System.out.println("Person2的规划");
	}
}

上述可见,Person1和Person2都继承了模板类PPT,并且都实现了父类的workSummary()和nextPlanning()两个方法。

测试方法:

public class Main {
	public static void main(String[] args) {
		PPT person1 = new Person1PPT();
		PPT person2 = new Person2PPT();
		person1.demonstration();
		person2.demonstration();
	}
}

运行结果:

在这里插入图片描述

3 总结

优点:

  1. 模板类中封装了不变部分,可变的部分由子类扩展。
  2. 公共代码提取在父类中,便于代码复用。
  3. 行为由父类控制,具体的实现由子类完成。

缺点:

  1. 每一个不同的实现都需要一个子类,会导致类的数量增加。
  2. 模板方法中的步骤越多, 维护工作就会越困难。

使用场景:

  1. 当多个类的逻辑和步骤一致,且只有其中部分内容有区别,则可采用模板方法模式。

使用步骤:

  1. 将相同的部分提取到父类的模板方法中。
  2. 在父类的模板方法中确定逻辑和流程。
  3. 将不同的部分抽象成抽象方法,由不同的子类实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeJR

如果觉得有用请赏一个呗!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值