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

    设计模式之模板模式
    1. 案例

      1. 豆浆制作

        1. 豆浆制作流程选材-->添加配料-->浸泡-->放到豆浆机打碎

        2. 通过添加不同的材料,可以制作出不同口味的豆浆

        3. 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每一种口味的豆浆都是一样的

        4. 通过模板方法实现

    2. 模板方法基本介绍

      1. 介绍

        1. 模板方法模式,又叫模板模式,在一个抽象类公开定义了执行它的模板的方法,其子类可以按需要重写方法实现,但是调用将以抽象类中定义的方式进行

        2. 简单说,模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重新定义该算法的某些特定步骤

        3. 这种类型的模式属于行为模式

      2. 原理类图

         

    3. 实例实现

      1. 类图

      2. 代码

        //抽闲类,表示豆浆
        public abstract class SoyMilk{
           //模式方法
           public final void make(){
               //流程
               select();
               addCondiments();
               soak();
               beat();
          }
           
           //选材
           public void select(){
               System.out.println("第一步:选择好的新鲜黄豆");
          }
           //添加配料
           public void addCondiments();
           //浸泡
           public void soak(){
               System.out.println("第三步:黄豆和配料开始浸泡");
          }
           //打磨
           public void beat(){
               System.out.println("第四步:黄豆和配料放到豆浆机打碎 ");
          }
        }

        //红豆豆浆
        public class RedBeanSoyMilk extends SoyMilk{
           //实现添加配料方法
           @Override
           public void addCondiments(){
               System.out.println("第三步:添加红豆配料");
          }
        }
        //
        public class Client{
           public static void main(String [] args){
               SoyMilk soyMilk = new RedBeanSoyMilk();
               soyMilk.make();
          }
        }

         

    4. 模板模式中钩子方法

      1. 在模板方法模式的父类中,我们可以定义一个方法 ,它默认不做任何事,子类可以视情况要不要覆盖它该方法称为钩子

      2. 比如上面实例,客户不想添加配料,只需要一杯纯豆浆

      3. 代码

        //抽闲类,表示豆浆
        public abstract class SoyMilk{
           //模式方法
           public final void make(){
               //流程
               select();
               if(customerWantCondiments){
                    addCondiments();
              }
               soak();
               beat();
          }
           
           //选材
           public void select(){
               System.out.println("第一步:选择好的新鲜黄豆");
          }
           //添加配料
           public void addCondiments();
           //浸泡
           public void soak(){
               System.out.println("第三步:黄豆和配料开始浸泡");
          }
           //打磨
           public void beat(){
               System.out.println("第四步:黄豆和配料放到豆浆机打碎 ");
          }
           
           //钩子方法,决定是否需要添加配料
           public  boolean customerWantCondiments(){
               return true;
          }
        }

        //红豆豆浆
        public class RedBeanSoyMilk extends SoyMilk{
           //实现添加配料方法
           @Override
           public void addCondiments(){
               System.out.println("第三步:添加红豆配料");
          }
        }
        //
        public class Client{
           public static void main(String [] args){
               SoyMilk soyMilk = new RedBeanSoyMilk();
               soyMilk.make();
          }
        }

         

       

    5. 模板方法模式在源码中的应用

      1. Spring IOC容器初始化时,应用到了模板方法模式

      2.  

       

       

       

       

       

       

       

       

       

       

       

  • 相关阅读:
    面向对象之多态(向上转型与向下转型)
    【Java面试题】解释内存中的栈(stack)、堆(heap)和静态存储区的用法
    自动装箱的本质是什么呢?
    基本数据类型float和double的区别
    Java中this和super的用法总结
    面试题——太(上)
    面试题——蓝
    C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期
    C语言——内存分配
    面试题——超
  • 原文地址:https://www.cnblogs.com/juddy/p/15017600.html
Copyright © 2011-2022 走看看