zoukankan      html  css  js  c++  java
  • 设计模式第12篇:模板方法模式

    一.模板方法模式介绍

      模板方法模式中规定了完成一个任务的各个工序的执行顺序,同时对某些通用的基础工序提供了默认的实现。比如给定一个造房子的任务,完成这个任务的工序可以分解为打地基buildFoundation(),建柱子buildPillars(),建墙buildWalls(),装窗户buildWindows()四个工序,只要建房子都要打地基和安装窗户,所以我们可以在模板类中给buildFoundation()方法和buildWindows()方法提供一个默认实现,其他的工序留着建具体屋子的类来实现。

    二.模板方法代码用例

      下面以建房子为例用代码来说明模板方法模式

      1.模板方法类HouseTemplate

      模板方法类中的模板方法定义了工序的执行顺序,此外为了避免模板方法被覆盖,我们将模板方法用final修饰。

    abstract class HouseTemplate {
    
        //template method, final so subclasses can't override
        public final void buildHouse(){
            buildFoundation();
            buildPillars();
            buildWalls();
            buildWindows();
            System.out.println("House is built.");
        }
    
        //default implementation
        private void buildWindows() {
            System.out.println("Building Glass Windows");
        }
    
        //methods to be implemented by subclasses
        public abstract void buildWalls();
        public abstract void buildPillars();
    
        private void buildFoundation() {
            System.out.println("Building foundation with cement,iron rods and sand");
        }
    }

      2.模板方法类的实例

      下面来建造木房子(WoodenHouse)和玻璃房子(GlassHouse)

    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");
        }
    
    }
    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");
        }
    
    }

      3.客户端使用模板方法

    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.

    三.模板方法的要点及使用

      1.模板类中,模板方法要定义好固定的工序执行顺序,此外模板方法要用final修饰以避免被子类覆盖

      2.模板方法中的方法调用的是子类的实现。

      3.为了使某些提供的默认实现方法不被覆盖,同样可以用final修饰

      在JDK中用到的模板方法:

      java.io中InputStream,OutStream,Reader,Reader的非抽象方法。

         java.util中AbstractSet,AbstractList,AbstractMap的非抽象方法。

                    

  • 相关阅读:
    haproxy配置ca证书
    gnu make
    工程引用libm.a文件的sin函数后
    bin utilities related
    ELF文件之九——使用链接脚本-2个函数-data-bss-temp-call-debug信息-struct
    ELF文件之八——使用链接脚本-2个函数-data-bss-temp-call-debug信息
    ELF文件之七——使用链接脚本-2个函数-data-bss-temp-call
    网站访问日志User Agent对照表
    jeecms上传文件限制导致413-Request Entity Too Large
    URL参数带加号“+”AJAX传值失败的解决方法
  • 原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/10255553.html
Copyright © 2011-2022 走看看