资讯专栏INFORMATION COLUMN

开发之路(设计模式九:模板方法模式)

kgbook / 2706人阅读

摘要:让一切变得更简单抽象化深入封装算法块,这便是设计模式当中的一种模式模板方法模式。定义模板方法模式在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中。

让一切变得更简单抽象化

深入封装算法块,这便是设计模式当中的一种模式:模板方法模式。
我们先来看看下面两个茶和咖啡配方

也许我们可以很快用Java代码实现出来,但我觉得做之前先分析分析,咖啡和茶的冲泡方式中第(1)步骤是完全一样的,我认为这样肯定会出现重复代码,写代码尽量不写重复代码,而第(2)(3)(4)步骤大体相似,

我们将两者步骤合起来看看

实现代码如下

咖啡因抽象类

package 改进之后;

/**
 * 咖啡因饮料(抽象类) 带钩子方法 模板方法
 * 
 * @author Joy
 * 
 */
public abstract class CaffeineBeverageWithHook {
    // 制作流程
    public void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        /*
         * 加上一个条件,具体有customerWantsCondiments()方法决定,当用户“想要”调料时,才调用addCondiments()方法
         */
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    /**
     * 因为咖啡和茶都有这两个方法,但只是具体实现不同 所以这两个方法必须声明为抽象,具体实现交由子类
     */
    // 冲泡的方法抽取出来
    public abstract void brew();

    // 加调料方法抽取出来
    public abstract void addCondiments();

    public void boilWater() {
        System.out.println("煮沸水");
    }

    public void pourInCup() {
        System.out.println("将饮料倒入杯子中");
    }

    /**
     * 定义一个方法(通常为空),这个方法只会返回true 这就是一个钩子方法 子类需根据需求是否覆盖这个方法
     * 
     * @return
     */
    // 添加一个新(“钩子”)方法,判断顾客是否需要添加调料
    public boolean customerWantsCondiments() {
        return true;
    }
}

咖啡类

package 改进之后;

import java.util.Scanner;

public class CoffeeWithHook extends CaffeineBeverageWithHook {

    @Override
    public void brew() {
        System.out.println("把沸水冲泡咖啡");
    }

    @Override
    public void addCondiments() {
        System.out.println("加糖加牛奶");
    }

    // 对此作出判断
    public boolean customerWantsCondiments() {
        String answer = getUserInput();
        if (answer.equals("y")) {
            return true;
        }
        System.out.println("咖啡不加调料");
        return false;
    }

    // 询问顾客是否需要加糖加奶
    private String getUserInput() {
        String answer = null;
        Scanner input = new Scanner(System.in);
        System.out.println("请问你是否需要在咖啡里加糖加奶呢?(y/n)");
        answer = input.next();
        if (answer.equals("y")) {
            return answer;
        } else if (answer.equals("n")) {
            return answer;
        } else {
            return "error";
        }
    }
}

茶类

package 改进之后;

import java.util.Scanner;

public class TeaWithHook extends CaffeineBeverageWithHook {

    @Override
    public void brew() {
        System.out.println("把沸水浸泡茶叶");
    }

    @Override
    public void addCondiments() {
        System.out.println("加柠檬");
    }

    @Override
    public boolean customerWantsCondiments() {
        String answer = getUserInput();
        if (answer.equals("y")) {
            return true;
        }
        System.out.println("茶不加调料");
        return false;
    }

    // 询问顾客是否需要加糖加奶
    private String getUserInput() {
        String answer = null;
        Scanner input = new Scanner(System.in);
        System.out.println("请问你是否需要在茶里加柠檬呢?(y/n)");
        answer = input.next();
        if (answer.equals("y")) {
            return answer;
        } else if (answer.equals("n")) {
            return answer;
        } else {
            return "error";
        }
    }
}

测试类

package 改进之后;

public class TestMain {
    public static void main(String[] args) {
        CoffeeWithHook coffeeHook = new CoffeeWithHook();
        TeaWithHook teaHook = new TeaWithHook();
        System.out.println("========制作咖啡");
        coffeeHook.prepareRecipe();

        System.out.println("
========制作茶");
        teaHook.prepareRecipe();
    }
}

效果图

而所谓“钩子”方法其实是根据不同情况而做出不同响应结果的一种判断方法,这其我就实现一个最简单的钩子方法,根据y/n的输入得出用户是否要加入调料。

定义模板方法模式:在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。

注:模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类去实现。

感谢你看到这里,模板方法模式到这里就结束了,本人文笔随便,若有不足或错误之处望给予指点,90度弯腰~~~很快我会发布下一个设计模式的内容,生命不息,编程不止!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67639.html

相关文章

  • JS 设计模式 模板模式

    摘要:模版方法由抽象类声明并加以实现。抽象类中的模版方法正是通过实现类扩展的方法来完成业务逻辑。一般来说,抽象类中的模版方法是不易反生改变的部分,而抽象方法是容易反生变化的部分,因此通过增加实现类一般可以很容易实现功能的扩展,符合开闭原则。 模板方法模式 定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。 模板方法模式是编程中经...

    张迁 评论0 收藏0
  • Python 进阶之路 () 再立Flag, 社区最全的itertools深度解析(上)

    摘要:例如,以下对两个的相应元素求和这个例子很好的解释了如何构建中所谓的迭代器代数的函数的含义。为简单起见,假设输入的长度可被整除。接受两个参数一个可迭代的正整数最终会在中个元素的所有组合的元组上产生一个迭代器。 前言 大家好,今天想和大家分享一下我的itertools学习体验及心得,itertools是一个Python的自带库,内含多种非常实用的方法,我简单学习了一下,发现可以大大提升工作...

    tuantuan 评论0 收藏0
  • 笔记 - 收藏集 - 掘金

    摘要:目录如何用提高效率后端掘金经常有人说我应该学一门语言,比如之类,但是却不知道如何入门。本文将通过我是如何开发公司年会抽奖系统的后端掘金需求出现年会将近,而年会抽奖环节必不可少,但是抽奖系统却还没有。 云盘一个个倒下怎么办?无需编码,手把手教你搭建至尊私享云盘 - 工具资源 - 掘金微盘挂了,360倒了,百度云盘也立了Flag。能让我们在云端储存分享文件的服务越来越少了。 买一堆移动硬盘...

    Alex 评论0 收藏0
  • Python 进阶之路 (六) 浅一深 lambda,陈独秀你给我坐下!

    摘要:好啦,首先让我们先搞明白基础定义,到底是什么表达了中用于创建匿名函数的特殊语法。其实总结起来,可以理解为一个小的匿名函数,函数可以使用任意数量的参数,但只能有一个表达式。 lambda是什么 大家好,今天给大家带来的是有关于Python里面的lambda表达式详细解析。lambda在Python里面的用处很广,但说实话,我个人认为有关于lambda的讨论不是如何使用的问题,而是该不该用...

    WelliJhon 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<