模板方法模式

 

首先我们要知道什么是模板方法设计模式?

  模板方法设计模式就是定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

为什么要使用模板方法设计模式?
  模板方法模式是比较简单的一种设计模式,但是它却是代码复用的一项基本的技术,在类库中尤其重要,它遵循“抽象类应当拥有尽可能多的行为,应当拥有尽可能少的数据”的重构原则。作为模板的方法要定义在父类中,在方法的定义中使用到抽象方法,而只看父类的抽象方法是根本不知道怎样处理的,实际做具体处理的是子类,在子类中实现具体功能,因此不同的子类执行将会得出不同的实现结果,但是处理流程还是按照父类定制的方式。这就是模板方法的要义所在,制定算法骨架,让子类具体实现。

在什么情况下使用?
     -->算法或操作遵循相似的逻辑
  
   -->重构时(把相同的代码抽取到父类中)

   -->重要、复杂的算法,核心算法设计为模板算法

接下来我们来看看到底怎么才能实现模板方法设计模式
我们以饮料机为示例的原型,每台饮料机都可以制作出不同的饮料,如同一台饮料机可 制作咖啡 还可以 制作茶
  假如:制作咖啡的步骤如下:        制作茶的步骤如下:
      1.将水煮沸                1.将水煮沸
      2.用沸水泡咖啡              2.用沸水将茶叶煮五到六分钟
      3.将咖啡倒入杯中             3.将茶水倒入杯中
      4.加入糖块或牛奶             4.加入柠檬或不加任何东西
那么,由上面的背景可见,我们制作咖啡和制作茶的步骤中 1 3是完全一致的,而2 4则是各自执行的各自的步骤
所有我们就可以设计一个模板,来规范制作过程

/*             
 * 抽象类   饮料机模板类
 */
public abstract class Template {
    /*
     * 制备饮料的模板方法
     * 封装了所有子类的共同遵循的算法框架
     */
    public final void driveTemplate(){ //这个模板必须用final修饰,因为不能允许子类修改这个模板框架,只能是修改特定的步骤
        //1.将水煮沸
        boilWater();
        //2. 炮制饮料
        blew();
        //3. 倒入杯中
        pourInCup();
       //4. 进入调味料
        addCondiments();  
    }
}

如上代码就是定义了一个制作饮料的模板,将具体的步骤都罗列出来了
因为我们的步骤1和步骤3都是相同的所以我们可以将其实现方法定义为私有的,以减少代码的复杂度,而步骤2和步骤4则可定义为抽象方法,其实现交由其子类完成
如:

/*
     * 基本方法,将水煮沸
     */
    private void boilWater() {
        System.out.println("将水煮沸");
    }

    /*
     * 基本方法,倒入杯中
     */
    private void pourInCup() {
        System.out.println("倒入杯中");
    }

    /*
     * 抽象的基本方法  加入调味料
     */
    public abstract void addCondiments();

    /*
     * 抽象的基本方法  炮制饮料
     */
    public abstract void blew();

这样我们就定义好了一个模板方法了,我们可以通过创建一个子类来继承自这个模板,重新其抽象方法
如 制作咖啡

/*
 * 制备咖啡的具体实现
 */
public class Coffee extends Template {

    //加入调味料
    @Override
    public void addCondiments() {
        System.out.println("加入糖和牛奶");
    }

    //炮制咖啡
    @Override
    public void blew() {
        System.out.println("用沸水冲泡咖啡");
    }

}

或者是制作茶

/*
 * 制备茶的具体实现
 */
public class Tea extends Template {
    //添加调料
    @Override
    public void addCondiments() {
        System.out.println("加入柠檬");
    }
    //冲泡茶
    @Override
    public void blew() {
        System.out.println("用80度的热水浸泡茶叶5分钟");
    }

}

这样我们在测试类中就能很清楚的看到结果了

//测试类
public class Test {
    public static void main(String[] args) {
        System.out.println("制备咖啡");
        Template t1=new Coffee();
        t1.driveTemplate();
        System.out.println("咖啡制备完成");
        System.out.println("=====================");
        System.out.println("制备茶");
        Template t2=new Tea();
        t2.driveTemplate();
        System.out.println("制备茶完成");
    }
}

测试结果如图
图片描述
当然,如果我们现在有另外一种需求呢?就是我制作茶的时候不想要添加任何东西,这时候我们使用上面的方法是没法完成的,这时候我们就引出了
模板方法设计模式中的另一个名词, 钩子函数
我们可以使用钩子函数来判断是否要执行某一步的操作
如:

/*             
 * 抽象类   饮料机模板类
 */
public abstract class Template {
    /*
     * 制备饮料的模板方法
     * 封装了所有子类的共同遵循的算法框架
     */
    public final void driveTemplate(){ //这个模板必须用final修饰,因为不能允许子类修改这个模板框架,只能是修改特定的步骤
        //1.将水煮沸
        boilWater();
        //2. 炮制饮料
        blew();
        //3. 倒入杯中
        pourInCup();

        //钩子函数进行判定(例如茶不想加入调味料)
        if(isRight()){
            //4. 进入调味料
            addCondiments();
        }
    }

    /*
     * 基本方法,将水煮沸
     */
    private void boilWater() {
        System.out.println("将水煮沸");
    }

    /*
     * 基本方法,倒入杯中
     */
    private void pourInCup() {
        System.out.println("倒入杯中");
    }

    /*
     * 抽象的基本方法  加入调味料
     */
    public abstract void addCondiments();

    /*
     * 抽象的基本方法  炮制饮料
     */
    public abstract void blew();

    //钩子函数  判断用户是否要执行某些功能  
    public boolean isRight(){
        return true;
    }

}

假如在制作茶的时候不想加任何东西,那么我们只需要在制作茶的子类中将钩子函数重写即可

/*
 * 制备茶的具体实现
 */
public class Tea extends Template {
    //添加调料
    @Override
    public void addCondiments() {
        System.out.println("加入柠檬");
    }
    //冲泡茶
    @Override
    public void blew() {
        System.out.println("用80度的热水浸泡茶叶5分钟");
    }
    //重写钩子函数 改变其值
    @Override
    public boolean isRight(){
        return false;
    }

}

这样的执行结果如图

图片描述

这样就完成了我们的需求了


作者: 巴黎的雨季 
链接:http://www.imooc.com/article/12504

转载于:https://www.cnblogs.com/wwwx/p/6248677.html

内容概要:本文档提供了关于“微型车间生产线的设计与生产数据采集试验研究”的毕业设计复现代码,涵盖从论文结构生成、机械结构设计、PLC控制系统设计、生产数据采集与分析系统、有限元分析、进度管理、文献管理和论文排版系统的完整实现。通过Python代码和API调用,详细展示了各个模块的功能实现和相互协作。例如,利用SolidWorks API设计机械结构,通过PLC控制系统模拟生产流程,使用数据分析工具进行生产数据的采集和异常检测,以及利用进度管理系统规划项目时间表。 适合人群:具有机械工程、自动化控制或计算机编程基础的学生或研究人员,尤其是从事智能制造领域相关工作的人员。 使用场景及目标:①帮助学生或研究人员快速搭建和理解微型车间生产线的设计与实现;②提供完整的代码框架,便于修改和扩展以适应不同的应用场景;③作为教学或科研项目的参考资料,用于学习和研究智能制造技术。 阅读建议:此资源不仅包含详细的代码实现,还涉及多个学科领域的知识,如机械设计、电气控制、数据分析等。因此,在学习过程中,建议读者结合实际操作,逐步理解每个模块的功能和原理,并尝试调整参数以观察不同设置下的系统表现。同时,可以参考提供的文献资料,深入研究相关理论和技术背景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值