zoukankan      html  css  js  c++  java
  • 模板设计模式(Template Design Pattern)

    如果说算法,数据结构是编码术的层面,那么设计模式则是编码中的道。

    定义

    模板设计模式,定义一组算法的框架,这些算法的步骤大致相同。而将这些算法中不同的步骤延迟到子类中实现。

    例子

    我们在日常生活中使用的料理机时,先将原材料经过初步处理(打豆浆,需要泡豆子;榨果汁,需要提前将水果洗好),然后打开料理机的盖子打开,将原材料放进去,打开料理机开关完成粉碎,然后过滤,得到我们想要的果汁(或豆浆)。将整个流程抽象:

    • 1,准备原材料
    • 2,完成粉碎
    • 3,过滤出果汁(豆浆)

    我感觉自己快变成一个厨师了。

    这三个步骤中的第一个步骤可以根据材料的不同可以有不同的操作,第二,三个步骤就比较固定了。

    UML 图

    代码实现

    • 抽象类,定义算法流程
    public abstract class DrinkMaker {
    
        public final void run() {
            prepareMaterial();
            smash();
            filter();
        }
    
        public abstract void prepareMaterial();
    
        private void smash() {
            System.out.println("material is smashed!");
        }
    
        private void filter() {
            System.out.println("drink is filter out!");
        }
    }
    
    • 实现类,实现父类中的prepareMaterial,准备豆子。
    public class SoyBeanMaker extends DrinkMaker {
        @Override
        public void prepareMaterial() {
            prepareSoybean();
        }
    
        private void prepareSoybean() {
            System.out.println("soybean is prepared!");
        }
    }
    
    • 实现类,实现父类的prepareMaterial,准备水果。
    public class FruitJuiceMaker extends DrinkMaker {
        @Override
        public void prepareMaterial() {
            prepareFruit();
        }
        
        private void prepareFruit() {
            System.out.println("Fruit is prepared!");
        }
    }
    

    详解

    通过上面的UML图和代码,可以看出,模板设计模式,首先在父类中定义了一个流程,规定每个步骤应该做什么。子类根据制作饮料的不同,准备不同的材料(实现父类中定义的第一个抽象步骤)。

    优点

    1,相同的流程只需要定义在父类就可以,减少了重复代码。
    2,在修改流程时,只需要修改父类的run方法就可以,不需要对每个子类修改。

    I am chris, and what about you?
  • 相关阅读:
    一个男人该有的气质
    有没有想过,也许一辈子你都是个小人物
    System.IO.File.WriteAllText("log.txt", "dddd");
    cn_windows_10_enterprise_version_1703_updated_june_2017_x64_dvd_10720588.iso
    Visual Studio 2015 update 3各版本下载地址
    优麒麟 16.04 LTS(长期支持)版本
    干货!最全羽毛球技术动态分解gif图
    添加缓存 绝对时间过期
    C#缓存absoluteExpiration、slidingExpiration两个参数的疑惑
    无法解析依赖项。“Microsoft.Net.Http 2.2.29”与 'Microsoft.Net.Http.zh-Hans
  • 原文地址:https://www.cnblogs.com/arax/p/9053439.html
Copyright © 2011-2022 走看看