15,模板方法模式(TemplateMethod)
15.1,基本介绍
- 模板方法模式(Template Method Pattern),在一个抽象类中公开定义执行它的方法的模板。子类中可以按需重写相关方法进行自定义,调用则通过抽象类以多态的形式进行。
- 简单来说,模板方法模式定义了一个算法骨架,将一些步骤的实现延伸到子类中,使得子类可以不改变算法结构,但能重定义算法中的某个步骤
15.2,类图
- 定义顶层抽象类:
CommonTemplate
,在该抽象类中定义算法骨架,对公共的部分进行公共实现,对需要子类实现的部分提供抽象方法,由子类继承实现 - 定义具体类:
Concrete
,继承自抽象类,并重写抽象方法,实现自定义算法;也可覆盖父类中已经实现的公共方法,进行算法覆盖
15.3,代码实现
-
CommonTemplate
:顶层抽象类package com.self.designmode.template; /** * @author PJ_ZHANG * @create 2020-12-03 18:03 **/ public abstract class CommonTemplate { public void common() { commonSomething(); doSomething(); } public abstract void doSomething(); private void commonSomething() { System.out.println("公共方法..."); } }
-
Concrete_1
:具体类_1package com.self.designmode.template; /** * @author PJ_ZHANG * @create 2020-12-03 18:04 **/ public class Concrete_1 extends CommonTemplate { @Override public void doSomething() { System.out.println("A doSomething..."); } }
-
Concrete_2
:具体类_2package com.self.designmode.template; /** * @author PJ_ZHANG * @create 2020-12-03 18:04 **/ public class Concrete_2 extends CommonTemplate { @Override public void doSomething() { System.out.println("B doSomething..."); } }
-
Client
:客户端package com.self.designmode.template; /** * @author PJ_ZHANG * @create 2020-12-03 18:04 **/ public class Client { public static void main(String[] args) { CommonTemplate concreteA = new Concrete_1(); concreteA.common(); CommonTemplate concreteB = new Concrete_2(); concreteB.common(); } }
15.4,注意事项和细节
- 基本思想:基础算法只存在在一个地方,即父类中。需要进行算法基础算法修改时,只需要修改一处,子类中会默认继承
- 实现代码最大化复用,父类中的模板方法和已经实现的基础算法会被子类所共用
- 在统一了算法的同时,提供了算法的灵活性。父类模板方法保证算法结构不变,同时子类提供部分算法步骤的实现
- 不足之处:每一个不同的实现都要重写一个子类实现,导致类个数增加,系统庞大
- 一般模板方法需要加上final关键字,防止算法结构被子类重写打散
- 使用场景:需要完成某个过程,该过程需要一系列步骤,步骤逻辑基本一致,但存在个别步骤实现方式不同,可以考虑使用模板方法模式处理