首页 > 其他分享 >模板设计模式

模板设计模式

时间:2023-06-04 16:45:49浏览次数:34  
标签:name 子类 fish 设计模式 方法 模板 String

模板设计模式

  • 定义
    1、模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
    2、简单说,模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤,这种类型的设计模式属于行为型模式。

模板方法模式

1、类图

2、模板方法

   public final void cooking(BigDecimal money) {
        Preconditions.checkArgument(money.doubleValue() > 0.0d , "enter an amount greater than 0");

        ReentrantLock lock = new ReentrantLock();
        Boolean flag;
        lock.lock();
        try {
            String name = "Crucian carp";
            int size = 6;
            flag = buyFish(money , size , name);
            if (flag) {
                Fish fish = FishListHolder.fishMap.get(name);
                cleanFish(fish , size);
                sideDishes(name);
                spices(name);
                onPot(name);
            }
        }finally {
            lock.unlock();
        }

    }

1、上面的 cooking 方法就是我们定义的模板方法,用来定义统一的执行流程,在模板类中我们可以定义相关的抽象方法并通过子类去加以实现,完成我们具体的方法的填充。
2、模板方法中包括 buyFishcleanFishsideDishesspicesonPot 等抽象方法

模板类具体实现

public class SteamedCookFish extends CookFish{

    @Override
    protected Boolean buyFish(BigDecimal money, int size, String name) {
        Fish fish = FishListHolder.fishMap.get(name);

        BigDecimal paymentAmount = BigDecimal.valueOf(size * fish.getUnitPrice());

        if (money.doubleValue() >= paymentAmount.doubleValue()) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

    @Override
    protected void cleanFish(Fish fish , int size) {
        System.out.println(String.format("Careful cleaning of [{%s}] pounds of [{%s}] fish" , size ,  fish.getName()));
    }

    @Override
    protected void sideDishes(String name) {
        System.out.println(String.format("Prepare the side dishes for the [{%s}] fish" , name));
    }

    @Override
    protected void spices(String name) {
        System.out.println(String.format("Prepare the seasoning for the  [{%s}] fish" , name));
    }

    @Override
    protected void onPot(String name) {
        System.out.println(String.format("Put the [{%s}] fish and seasoning into the pot" , name));
    }
}

1、到这里我们就完成了基本的实现了模板设计模式,本设计模式主要对烹饪 cooking 这个方法进行具体的拆分,从而达到流程控制的作用。

测试

  • 编写具体的测试类来进行我们模板方法的测试
public class TemplatePatterns {

    public static void main(String[] args) {

        CookFish cookFish = new SteamedCookFish();
        cookFish.cooking(new BigDecimal(100));

    }
}


1、通过上面步骤我们就完成了模板方法的编写

注意事项

1、模板类需要定义成抽象类 (abstract),具体的模板方法需要定义成 final 方法防止子类重写,分解的子类需要定义成 abstract 方法以便于子类进行扩充和实现

标签:name,子类,fish,设计模式,方法,模板,String
From: https://www.cnblogs.com/ayizzz/p/17455876.html

相关文章

  • Django模板引擎
        Django作为Web框架,需要一种很便利的方法动态地生成HTML网页,因此有了模板这个概念。模板包含所需HTML的部分代码以及一些特殊语法,特殊语法用于描述如何将视图传递的数据动态插入HTML网页中。一个Jinja2。其他模板语言的后端可以从第三方获得。Django定义了一个标准的API......
  • 广州网站建设干货:定制网站建设与模板网站不同之处!
    定制网站建设与模板网站有什么不同之处?在企业建设网站的过程中,通常会面临一个选择,那就是究竟:使用模板网站,还是采用定制网站建设。虽然这两种方式都可以创建出一个有效的网站,但哪种模式可以让你的企业做得更大更好呢?广州名锐讯动从不同维度分析两者,总结了以下几点干货给大家!首先我们......
  • 模板方法模式
    TheTemplateMethoddesignpatterndefinestheskeletonofanalgorithminanoperation,deferingsomestepstosubclasses.Thispatternletssubclassesredefinecertainstepsofanalgorithmwihoutchangingthealgorithm'sstructure.模板方法设计模式在操作中......
  • 创建型设计模式
    TheCreationalDesignPatternareCategorizedintotwotypes. Object-CreationalPatterns:Object-CreationalPatternsdealwithobjectcreation.Here,itdeferspartofitsobjectcreationtoanotherobject.Class-CreationalPatterns:Class-CreationalPa......
  • WPF 入门笔记 - 03 - 样式基础及控件模板
    ......
  • 模板引擎 Handlebars.js
    概述Handlebars.js是一个简单而强大的JavaScript模板引擎。它允许开发者通过定义模板和数据来生成动态的HTML页面。Handlebars.js基于Mustache模板语法,它提供了一些扩展和增强功能。并且开发者可以创建可重用的模板,并通过将数据传递给模板来生成最终的输出。这种分离数......
  • 3月25日邓老师设计模式面试资料02
    Spring面试专题1.Spring应该很熟悉吧?来介绍下你的Spring的理解  有些同学可能会抢答,不熟悉!!!  好了,不开玩笑,面对这个问题我们应该怎么来回答呢?我们给大家梳理这个几个维度来回答1.1Spring的发展历程  先介绍Spring是怎么来的,发展中有哪些核心的节点,当前的最新版本是......
  • 3、利用初始化好的虚拟机当作模板,用于克隆
    利用初始化好的虚拟机当作模板,用于克隆第一步:先拷贝个虚拟机当作模板[root@ubuntimages]#virt-clone-orocky8-f/var/lib/libvirt/images/rocky8-template.qcow2-nrocky8-templateAllocating'rocky8-template.qcow2'......
  • 4、虚拟机单机、集群的克隆、删除脚本(以初始化好的虚拟机为模板)
    虚拟机克隆、删除脚本[root@ubunt~]#catclone.sh#!/bin/bash##./etc/init.d/functions(如果是ubuntu,注释此行)Red="\e[1;31m"Purple="\e[1;35m"Green="\e[1;32m"Blue="\e[1;36m"Yellow="\e[1;33m"End="\e[0m&......
  • 大话设计模式之单例,策略,简单工厂
    基于实际面试题实现importjava.util.HashMap;importjava.util.Map;importjava.util.Random;/***用java设计一个机房环境监测系统的代码框架,机房有多种传感器,可以实时检测机房的温度、湿度、噪音等数据,*并把数据实时发送到监控中心,其中某项数据超过不健康阈值立即上......