设计模式13 模板方法模式

模板方法模式(TemplateMethod)定义:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。

模板方法模式的优点有:

1、它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。

2、它在父类中提取了公共的部分代码,便于代码复用。

3、部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

抽象类(父类):

 1 public abstract class AbstractClass {
 2     //已知<执行顺序>
 3     public void TemplateMethod() {
 4         SpecificMethod();
 5         abstractMethod1();
 6         abstractMethod2();
 7     }
 8 
 9     //已知的<具体实现>
10     public void SpecificMethod() {
11         System.out.println("抽象类中的方法被调用");
12     }
13 
14     //未知的<具体实现>
15     public abstract void abstractMethod1();
16     public abstract void abstractMethod2();
17 }

具体类(子类):

 1 public class ConcreteClassA extends AbstractClass {
 2     @Override
 3     public void abstractMethod1() {
 4         // TODO Auto-generated method stub
 5         System.out.println("实现A中方法1被调用");
 6     }
 7 
 8     @Override
 9     public void abstractMethod2() {
10         // TODO Auto-generated method stub
11         System.out.println("实现A中方法2被调用");
12     }
13 }
14 
15 public class ConcreteClassB extends AbstractClass {
16     @Override
17     public void abstractMethod1() {
18         // TODO Auto-generated method stub
19         System.out.println("实现B中方法1被调用");
20     }
21 
22     @Override
23     public void abstractMethod2() {
24         // TODO Auto-generated method stub
25         System.out.println("实现B中方法2被调用");
26     }
27 }

调用方式:

 1 public class Client {
 2     //子类继承父类,通过new出不同的子类实现不同的行为
 3     public static void main(String[] args) {
 4         /*设计一个系统时知道了算法所需的关键步骤,
 5          * 已知<执行顺序>,
 6          * 还未知<某些步骤的具体实现>,
 7          * 或者说某些步骤的实现与具体的环境相关。
 8          * */
 9         
10         //扩展点
11         AbstractClass abstractClass;
12         
13         //具体实现A
14         abstractClass = new ConcreteClassA();
15         //切换到具体实现B
16         //abstractClass = new ConcreteClassB();
17         
18         //稳定的代码
19         abstractClass.TemplateMethod();
20     }
21 }

执行结果:

原文地址:https://www.cnblogs.com/asenyang/p/12111060.html