zoukankan      html  css  js  c++  java
  • 设计模式模板方法模式

    设计模式-模板方法模式(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 }

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

  • 相关阅读:
    【Java POI】POI基于事件驱动解析大数据量2007版本Excel,空值导致列错位问题
    【Java MyBatis Generator】使用generator自动生成Dao,Mapping和实体文件
    Java连接MQ的实例, 测试类
    与MQ通讯的完整JAVA程序
    MQ中将消息发送至远程队列的配置
    IBM MQ 使用指南
    Java调用MQ队列
    IBM MQ介绍
    HttpWebRequest和HttpWebResponse
    SQL SERVER中DBLINK的实现
  • 原文地址:https://www.cnblogs.com/aihuxi/p/8125090.html
Copyright © 2011-2022 走看看