zoukankan      html  css  js  c++  java
  • Java 设计模式系列(十三)模板方法

    Java 设计模式系列(十三)模板方法

    模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

    一、模板方法的结构

    图13-1 模板方法的结构

    • AbstractClass:抽象类。用来定义算法骨架和原语操作,具体的子类通过重定义这些原语操作来实现一个算法的各个步骤。在这个类里面,还可以提供算法中通用的实现。

    • ConcreteClass:具体实现类。用来实现算法骨架中的某些步骤,完成跟特定子类相关的功能。

    源代码

    (1) 抽象模板角色类

    /**
     * 定义模板方法、原语操作等的抽象类
     */
    public abstract class AbstractTemplate {
        /** 原语操作1,所谓原语操作就是抽象的操作,必须要由子类提供实现 */
        public abstract void doPrimitiveOperation1();
    
        /** 原语操作2 */
        public abstract void doPrimitiveOperation2();
    
        /** 模板方法,定义算法骨架 */
        public final void templateMethod() {
            doPrimitiveOperation1();
            doPrimitiveOperation2();
        }
    }
    

    (2) 具体模板角色类

    /**
     * 具体实现类,实现原语操作
     */
    public class ConcreteTemplate extends AbstractTemplate {
        public void doPrimitiveOperation1() {
            //具体的实现
        }
        public void doPrimitiveOperation2() {
            //具体的实现
        }
    }
    

    模板模式的关键是:子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑。

    每当定义一个新的子类时,不要按照控制流程的思路去想,而应当按照“责任”的思路去想。换言之,应当考虑哪些操作是必须置换掉的,哪些操作是可以置换掉的,以及哪些操作是不可以置换掉的。使用模板模式可以使这些责任变得清晰。

    二、总结

    模板方法中的方法可以分为两大类:模板方法和基本方法。

    (1) 模板方法

    一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。

    一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。

    (2) 基本方法

    基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

    • 抽象方法:一个抽象方法由抽象类声明,由具体子类实现。在Java语言里抽象方法以abstract关键字标示。

    • 具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。

    • 钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。


    每天用心记录一点点。内容也许不重要,但习惯很重要!

  • 相关阅读:
    josn类库引用
    WPF圆角按钮
    C#实现某一属性值变化时触发事件 Form1_changeEvent是对应的事件
    C#winform生成安装包
    特性
    反射可以动态调用对象(一般是类)的名称,属性,方法等。具体见下。重要
    原子操作 和Inerlocked 常用于多线程同步
    spingboot 配置多个数据源报错
    Address already in use: JVM_Bind 端口被占用的几个解决办法
    数据库问题(一)
  • 原文地址:https://www.cnblogs.com/binarylei/p/9016774.html
Copyright © 2011-2022 走看看