lusiqi

设计模式-模板方法模式,介绍模板方法模式,及代码实现。


简介

模版方法模式属于行为型设计模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中去,模板方法使得子类可以不改变一个算法的结构便可重定义该算法的某些特定步骤。

特点

模板方法模式是通过把不变行为搬移到超类,去除籽类中重复代码来体现它的优势,也就是模板模式提供了一个很好的代码复用平台。

当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱了重复的不变行为的纠缠。

角色

  • 抽象父类:提取不同代码的抽象方法(在子类实现),模板方法调用此方法,并在模板方法中写入公共的重复代码。
  • 实现子类:继承抽象父类,实现自己业务不同的代码
  • 调用类:实际应用时,利用类的多态性,获得父类的子类实例,调用模板方法,即可实现业务逻辑。

代码实现

抽象父类

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
/**
* @description 模板方法抽象类:不变的部分给出具体实现,变化的部分封装为抽象方法延迟到子类实现
* @author dxy
* @date 20200309
*/
public abstract class AbstractTemplate {

/**
* 抽象子类,放在子类中去实现
*/
public abstract void primitiveOperation1();

/**
* 抽象子类,放在子类中去实现
*/
public abstract void primitiveOperation2();

/**
* 模板方法,给出逻辑的骨架,而逻辑的组成是一些相应的抽象操作,
* 他们都推迟到子类实现
*/
public void templateMethod() {
primitiveOperation1();
primitiveOperation2();
System.out.println("模板方法结束\n");
}

}

实现子类

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
35
36
37
38
39
/**
* @description 具体类A
* @author dxy
* @date 20200309
*
*/
public class ConcreteClassA extends AbstractTemplate {

@Override
public void primitiveOperation1() {
System.out.println("具体类A的方法1实现");
}

@Override
public void primitiveOperation2() {
System.out.println("具体类A的方法2实现");
}

}

/**
* @description 具体类B
* @author dxy
* @date 20200309
*
*/
public class ConcreteClassB extends AbstractTemplate {

@Override
public void primitiveOperation1() {
System.out.println("具体类B的方法1实现");
}

@Override
public void primitiveOperation2() {
System.out.println("具体类B的方法2实现");
}

}

客户端调用类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* @description 模板方法调用客户端
* @author dxy
* @date 20200309
*/
public class TemplateClient {

public static void main(String[] args) {

AbstractTemplate abstractTemplateA = new ConcreteClassA();
// 调用模板方法
abstractTemplateA.templateMethod();

AbstractTemplate abstractTemplateB = new ConcreteClassB();
// 调用模板方法
abstractTemplateB.templateMethod();

}
}

 评论