11.30模板方法模式

发布时间 2023-11-30 08:19:40作者: warriorschampionship

模板方法模式
一、模板方法模式
二、模板方法模式实例之数据库操作
1.实例说明
2.实例类图
3.实例代码
参考文献
一、模板方法模式
模板方法模式(Template Method Pattern)是一种类行为型模式。

定义:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
使用频率:3星
模式结构:
模板方法模式包含以下主要角色:
1)抽象类/抽象模板(Abstract Class)
抽象模板类,负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下。
① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
② 基本方法:是整个算法中的一个步骤,包含以下几种类型。
抽象方法:在抽象类中声明,由具体子类实现。
具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
2)具体子类/具体实现(Concrete Class)
具体实现类,实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
模板方法模式结构图:


优点:
1、它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
3、它在父类中提取了公共的部分代码,便于代码复用。
4、部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
缺点:
1、对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,间接地增加了系统实现的复杂度。
2、父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
3、由于继承关系自身的缺点,如果父类添加新的抽象方法,则所有子类都要改一遍。
应用场景:
1、算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
2、当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。首先,要识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3、当需要控制子类的扩展时,模板方法只在特定点调用钩子操作,这样就只允许在这些点进行扩展。

二、模板方法模式实例之数据库操作
1.实例说明
对数据库的操作一般包括连接、打开、使用、关闭等步骤,在数据库中模板类中我们定义了connDB、openDB、useDB、closeDB四个方法分别对应这四个步骤。对于不同类型的数据库(如SQLServer和Oracle)其操作步骤都一致,只是连接数据库connDB方法有所区别,现使用模板方法模式对其进行设计。

2.实例类图


3.实例代码
DBOperator充当抽象父类角色,SQLServerDBOperator和OracleDBOperator充当具体子类角色。

//抽象数据库操作类:抽象类
abstract class DBOperator{
public abstract void connDB();
public void openDB(){
System.out.println("打开数据库");
}
public void useDB(){
System.out.println("使用数据库");
}
public void closeDB(){
System.out.println("关闭数据库");
}
public void process(){
connDB();
openDB();
useDB();
closeDB();
}
}
//SQL Server 数据库操作类:具体子类
class SQLServerDBOperator extends DBOperator{

@Override
public void connDB() {
System.out.println("连接SQL Server数据库");
}
}
//Oracle数据库操作类:具体子类
class OracleDBOperator extends DBOperator{
@Override
public void connDB() {
System.out.println("连接Oracle数据库");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
客户端测试:

public class Client {
public static void main(String[] args) {
DBOperator operator;
operator = new SQLServerDBOperator();
operator.process();
System.out.println("------------------");
operator = new OracleDBOperator();
operator.process();
}
}
1
2
3
4
5
6
7
8
9
10
运行结果:

连接SQL Server数据库
打开数据库
使用数据库
关闭数据库
------------------
连接Oracle数据库
打开数据库
使用数据库
关闭数据库