zoukankan      html  css  js  c++  java
  • 设计模式之-模版方法(Template Method Design Pattern)

    模板方法是一种行为设计模式,它用于创建一个方法存根和推迟一些步骤执行的子类。模板方法定义的步骤来执行一个算法,它可以提供一种可能是共同的所有或一些子类的默认的实现。

    让我们来了解这种模式有一个例子,假设我们要提供一个算法来盖房子。该步骤需要执行盖房是 - 建筑物地基,建筑物的支柱,建筑墙体和窗户。最重要的一点是,我们不能改变执行的顺序,因为我们不能建立在建地基前去建造窗户。因此,在这种情况下,我们可以创建将使用不同的方法来构建房子的模板方法。

    现在所有类型的房子的地基都是是相同的,不论是它的一个木制的房子或是玻璃房子。因此,我们可以提供基本实现,如果子类需要重写此方法,它们可以重新实现内容,但大多是很常见的房屋所有类型。


    模版方法抽象类:

    由于我们想要子类实现该方法,所以我们创建基类为抽象类;


    HouseTemplate.java

    package com.journaldev.design.template;
     
    public abstract class HouseTemplate {
     
        //模版方法, final 拒绝子类重写
        public final void buildHouse(){
            buildFoundation();
            buildPillars();
            buildWalls();
            buildWindows();
            System.out.println("House is built.");
        }
     
        //默认实现
        private void buildWindows() {
            System.out.println("Building Glass Windows");
        }
     
        //子类必须实现方法
        public abstract void buildWalls();
        public abstract void buildPillars();
     
        private void buildFoundation() {
            System.out.println("Building foundation with cement,iron rods and sand");
        }
    }

    buildHouse()为模版方法,它定义了执行指令顺序由几个步骤组成
    我们可能会有多种类型房屋,这里以木质房,玻璃房为例

    WoodenHouse.java

    package com.journaldev.design.template;
     
    public class WoodenHouse extends HouseTemplate {
     
        @Override
        public void buildWalls() {
            System.out.println("Building Wooden Walls");
        }
     
        @Override
        public void buildPillars() {
            System.out.println("Building Pillars with Wood coating");
        }
     
    }

    我们可以实现多个方法,这里为了简单选择两个实现

    GlassHouse.java

    package com.journaldev.design.template;
     
    public class GlassHouse extends HouseTemplate {
     
        @Override
        public void buildWalls() {
            System.out.println("Building Glass Walls");
        }
     
        @Override
        public void buildPillars() {
            System.out.println("Building Pillars with glass coating");
        }
     
    }

    测试一下模版方法测试类:

    HousingClient.java

    package com.journaldev.design.template;
     
    public class HousingClient {
     
        public static void main(String[] args) {
             
            HouseTemplate houseType = new WoodenHouse();
             
            //using template method
            houseType.buildHouse();
            System.out.println("************");
             
            houseType = new GlassHouse();
             
            houseType.buildHouse();
        }
     
    }

    注意这里调用调用基类的模板的方法,并根据不同的实施步骤使用基类中继承,一些在子类中的重新实现方法

    输出结果:

    Building foundation with cement,iron rods and sand
    Building Pillars with Wood coating
    Building Wooden Walls
    Building Glass Windows
    House is built.
    ************
    Building foundation with cement,iron rods and sand
    Building Pillars with glass coating
    Building Glass Walls
    Building Glass Windows
    House is built.

    Template Method Class Diagram




    实现要点:

        1,模板方法包括某些步骤顺序是固定的,对于某些方法,由不同子类具体去实现,模板方法应该是最终是固定的。
        2, 大多数时候子类调用父类,但模板模式的方法父类的模板方法调用方法子类这是被称为好莱坞原则 - “不给我们打电话我们会打电话给你。”
        3,在基类中的方法默认的实现称为,他们的目的是由子类重写,如果你想使一些方法不能被覆盖,你可以使用final修饰,例如,在我们的例子中,我们可以 使用final buildFoundation修饰,因为我们不想子类重写它


    jdk中模版模式应用:

    所有非抽象方法

    java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer.

     java.util.AbstractList, java.util.AbstractSet and java.util.AbstractMap.


    原文链接:http://www.journaldev.com/1763/template-method-design-pattern-in-java


  • 相关阅读:
    Java openrasp学习记录(一)
    Java ASM3学习(3)
    Java ASM3学习(2)
    Java Instrumentation插桩技术学习
    Java ASM3学习(1)
    从JDK源码学习HashSet和HashTable
    从JDK源码学习HashMap
    从JDK源码学习ArrayList
    Java XXE漏洞典型场景分析
    CVE-2020-7961 Liferay Portal 复现分析
  • 原文地址:https://www.cnblogs.com/happyxiaoyu02/p/6818945.html
Copyright © 2011-2022 走看看