设计模式模板方法模式

设计模式-模板方法模式(Template Method Pattern)

2.1 定义

定义一个操作中算法的框架,将一些步骤延迟到子类中去操作,使得子类可以不改变结构就可以改变一些特定的步骤.

 

模板方法模式很简单.就只是使用了一个继承(extends),其中abstractClass 叫做抽象模板.

它的方法分为两类:

  1. 基本方法

具体操作,在子类进行操作由父类进行调用

  1. 模板方法

由一个或多个方法组成,也就是框架,完成对基本方法的调度

public abstract class AbstractClass {

    //基本方法
    protected void doSomething() {
        
    }
    //基本方法
    protected void doAnything() {
        
    }
    //模板方法
    public void templateMethod(){
        doSomething();
        doAnything();
    }
    
}

测试:

  

 1 public class TestClass extends AbstractClass {
 2 
 3     // 基本方法
 4     protected void doSomething() {
 5         System.out.println("基本方法实现 1");
 6     }
 7 
 8     // 基本方法
 9     protected void doAnything() {
10         System.out.println("基本方法实现 2");
11     }
12     
13     public static void main(String[] args) {
14         TestClass test = new TestClass();
15         test.templateMethod();
16     }
17 }

2.2 模板方式的应用

优点:

封装不变部分,拓展可变部分;

提取公共代码,易于维护

行为由父类控制,子类只负责实现

缺点:

最主要就是阅读难度的问题 容易让新手懵圈

使用场景:

多个子类有共有方法时,并且逻辑基本相同

重要,复杂的算法,可以把核心算法设计成模板方法,周边相关细节由子类完成

重构时,模板方法肯定是使用最多的方法,把相同的方法抽取到父类,在使用”钩子函数”约束其行为.

2.3 模板方法的扩展(钩子方法)

比如我们希望可以约束父类中某些方法的执行就可以使用钩子方法

 1 public abstract class AbstractClass {
 2 
 3     boolean flag = false;
 4     //基本方法
 5     protected void doSomething() {
 6         
 7     }
 8     //基本方法
 9     protected void doAnything() {
10         
11     }
12     //模板方法
13     public void templateMethod(){
14         if (flag) {
15             doSomething();
16         }
17         doAnything();
18     }
19     
20     //钩子方法
21     protected void setFlag(boolean flag) {
22         this.flag = flag;
23     }

//实现

 1 public class TestClass extends AbstractClass {
 2 
 3     // 基本方法
 4     protected void doSomething() {
 5         System.out.println("基本方法实现 1");
 6     }
 7 
 8     // 基本方法
 9     protected void doAnything() {
10         System.out.println("基本方法实现 2");
11     }
12     
13     public static void main(String[] args) {
14         TestClass test = new TestClass();
15         test.setFlag(true);
16         test.templateMethod();
17     }
18 }

这样就非常容易的 使用模板了.父类调用子类方法

原文地址:https://www.cnblogs.com/aihuxi/p/8125090.html