当前位置: 首页 > news >正文

设计模式-装饰者模式在Java中使用实例-打印发票装饰抬头和脚注

场景

设计模式-装饰者模式在Java中的使用示例:

设计模式-装饰者模式在Java中的使用示例_java装饰者模式例子-CSDN博客

上面装饰器的调用示例如下

        AbstarctComputer computer;//要买1台电脑computer = new BaseComputer();//加一个内存条computer = new MemoryDecorator(computer);//加一个硬盘computer = new DiskDecorator(computer);//再加一个内存条computer = new MemoryDecorator(computer);System.out.println(computer.getMsg()+",总价:"+computer.getPrice());

下面记录一个它的变形,以软件设计师2016年下半年试题六为例

某发票(lnvoice)由抬头(Head)部分、正文部分和脚注(Foot)部分构成。现采用装饰(Decorator)模式实现打印发票的功能,

得到如图6-1所示的类图

注:

博客:
霸道流氓气质-CSDN博客

实现

1、新建发票正文类

public class Invoice {public void printInvoice(){System.out.println("This is the content of the invoice !");}
}

2、新建普通装饰器

public class Decorator extends Invoice{protected Invoice ticket;public Decorator(Invoice t){ticket = t;}public void printInvoice(){if(ticket !=null){ticket.printInvoice();}}
}

3、新建抬头装饰器

public class HeadDecorator extends Decorator{public HeadDecorator(Invoice t) {super(t);}public void printInvoice(){System.out.println("This is the header of the invoice!");super.printInvoice();}
}

4、新建脚注装饰器

public class FootDecorator extends Decorator{public FootDecorator(Invoice t) {super(t);}public void printInvoice(){super.printInvoice();System.out.println("This is the footnote of the invoice !");}
}

5、调用示例

        Invoice t = new Invoice();Invoice ticket;ticket = new HeadDecorator(new FootDecorator(t));ticket.printInvoice();System.out.println("----------------------------");ticket = new HeadDecorator(new FootDecorator(null));ticket.printInvoice();

以上调用输出结果

This is the header of the invoice!
This is the content of the invoice !
This is the footnote of the invoice !
----------------------------
This is the header of the invoice!
This is the footnote of the invoice !

6、分析

基础回顾

子类创建对象时,会先调用父类的构造方法,然后再调用子类自己的构造方法。
但是,如果子类没有显式地定义构造方法,会使用默认的无参构造方法。

这就是为什么有时候我们需要重写继承的构造方法的原因。
 
在继承中,子类可以通过super关键字调用父类的构造方法。如果子类没有使用super关键字调用父类的构造方法,

Java会自动调用父类的无参构造方法。如果父类没有提供无参构造方法,且子类没有显示地调用其他构造方法,会导致编译错误
 
在父类中只有 有参构造函数,没有无参构造函数,子类如果不写构造函数,系统默认创建一个无参构造函数,

子类这个无参的构造函数就会去调用父类的无参构造函数,时候就出错。

以上链式调用时

        ticket = new HeadDecorator(new FootDecorator(t));
        ticket.printInvoice();

不好理解,可以将其修改为如下便于理解

        Invoice t = new Invoice();t.printInvoice();FootDecorator footDecorator = new FootDecorator(t);footDecorator.printInvoice();Invoice ticket = new HeadDecorator(footDecorator);ticket.printInvoice();

实现过程分步解析

首先是FootDecorator footDecorator = new FootDecorator(t)

先调用FootDecorator的构造方法,将t(设定地址为Invoice@506)通过构造方法传参传递

并在FootDecorator的构造方法中调用super(t)将其传到父类Decorator的构造方法中进行

 protected Invoice ticket的属性的赋值。此时父类Decorator的ticker为Invoice@506

然后将上面新建的footDecorator(设定地址为FootDecorator@509)传递给HeadDecorator的构造方法

此时Invoice t为FootDecorator@509,在其构造方法中通过super(t)调用父类构造方法,并将其赋值给

父类Decorator的protected Invoice ticket,所以此时父类Decorator的ticket为FootDecorator@509

返回值为HeadDecorator的对象(设定为HeadDecorator@511)

然后调用HeadDecorator@511的printInvoice方法

在printInvoice方法中,先输出

This is the header of the invoice!

然后调用父类Decorator的printInvoice方法

此时父类Decorator的ticket为FootDecorator@509,不为空,所以会调用FootDecorator对象FootDecorator@509

的printInvoice方法,方法中会先调用其父类的printInvoice方法,FootDecorator@509父类对象的ticket为Invoice@506

Invoice@506调用printInvoice方法会输出

This is the content of the invoice !

然后FootDecorator@509的printInvoice方法继续输出

This is the footnote of the invoice !

相关文章:

设计模式-装饰者模式在Java中使用实例-打印发票装饰抬头和脚注

场景 设计模式-装饰者模式在Java中的使用示例: 设计模式-装饰者模式在Java中的使用示例_java装饰者模式例子-CSDN博客 上面装饰器的调用示例如下 AbstarctComputer computer;//要买1台电脑computer new BaseComputer();//加一个内存条computer new MemoryDecor…...

parallel linux虚拟机没有root权限

前言 今天刚在parallel上装上linux虚拟机,安装的是Debian发行版。用终端输入命令时,无意间发现当前用户竟然不是root用户,岂有此理!众所周知,Linux系统一般安装之后都是默认root用户的,但是可能parallel先…...

科技下乡:数字乡村改变乡村生活方式

在科技飞速发展的时代,数字化、信息化浪潮正以前所未有的速度席卷全球。在这场科技革命中,乡村不再是滞后的代名词,而是成为了数字乡村建设的热土。科技下乡,让数字乡村成为了改变乡村生活方式的重要力量。 一、科技下乡&#xf…...

【GitLab】Ubuntu使用宝塔安装GitLab最新社区版

首先在Ubuntu安装宝塔面板 在官网可以找到脚本一键安装 安装GitLab社区版 然后在宝塔面板的“软件商店”里面找到GitLab最新社区版 12.8.1一键安装 安装过程中可能出现以下问题: 1.卡在ruby_block[wait for logrotate service socket] action run 解决办法&…...

C++入门(2)

目录 3. C输入&输出 4. 缺省(默认)参数 4.1 缺省参数概念 4.2 缺省参数分类 全缺省参数 半缺省参数 5. 函数重载 5.1 函数重载概念 6. 引用 6.1 引用概念 6.2 引用特性 6.3 常引用 6.4 使用场景 6.5 传值、传引用效率比较 6.5.1 值和引用的作为返回值类型的性能比较 6.6 引…...

Prometheus +Grafana +node_exporter可视化监控Linux + windows虚机

1、介绍 背景:需要对多台虚机进行负载可视乎监控,并进行及时的报警 2、架构图 node_exporter :主要是负责采集服务器的信息。 Prometheus :主要是负责存储、抓取、聚合、查询方面。 Grafana : 主要是…...

腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践

腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践 文章目录 腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践引言《2023腾讯云容器和函数计算技术实践精选集》整体评价特色亮点分析Serverless与Kubernetes的…...

python 字典练习

def main():dict1{姓名:张三, 工资: 5000}dict2{姓名:李四, 工资: 6600}dict3{姓名:王五, 工资: 8500}dict4{}dict1.update(dict2)#字典的写法print(dict1)dict1.setdefault("3月",0)#存在不作为,不存在则增补print(dict1)names[]list[dict1,dict2,dict3]…...

Postman进阶功能实战演练

Postman除了前面介绍的一些功能,还有其他一些小功能在日常接口测试或许用得上。今天,我们就来盘点一下,如下所示: 1.数据驱动 想要批量执行接口用例,我们一般会将对应的接口用例放在同一个Collection中,然…...

Flink基于Hudi维表Join缺陷解析及解决方案

Hudi,这个近年来备受瞩目的数据存储解决方案,无疑是大数据领域的一颗耀眼新星。其凭借出色的性能和稳定性,以及对于数据湖场景的深度适配,赢得了众多企业和开发者的青睐。然而,正如任何一项新兴技术,Hudi在…...

3.31学习总结

(本次学习总结,总结了目前学习java遇到的一些关键字和零碎知识点) 一.static关键字 static可以用来修饰类的成员方法、类的成员变量、类中的内部类(以及用static修饰的内部类中的变量、方法、内部类),另外可以编写static代码块来优化程序性…...

Android Studio控制台输出中文乱码问题

控制台乱码现象 安卓在调试阶段,需要查看app运行时的输出信息、出错提示信息。 乱码,会极大的阻碍开发者前进的信心,不能及时的根据提示信息定位问题,因此我们需要查看没有乱码的打印信息。 解决步骤: step1: 找到st…...

itextPdf生成pdf简单示例

文章环境 jdk1.8&#xff0c;springboot2.6.13 POM依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><dependency><groupId>com.ite…...

【Linux系列】tree和find命令

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

AI预测福彩3D第23弹【2024年4月1日预测--第4套算法重新开始计算第9次测试】

今天继续对第4套算法进行测试&#xff0c;因为第4套算法已连续多期命中&#xff0c;相对来说还算稳定。好了&#xff0c;废话不多说了&#xff0c;直接上预测的结果吧~ 2024年4月1日福彩3D的七码预测结果如下 第一套&#xff1a; 百位&#xff1a;0 1 …...

Java常见限流用法介绍和实现

目录 一、现象 二、工具 ​​​​​​1、AtomicInteger,AtomicLong 原子类操作 ​​​​​​2、RedisLua ​​​​​​3、Google Guava的RateLimiter 1&#xff09; 使用 2&#xff09; Demo 3&#xff09; 优化demo 4、阿里开源的Sentinel 三、算法 1、计数限流 &…...

算法——图论:判断二分图(染色问题)

题目&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;并查集 class Solution { public:vector<int>father;int find(int x){if (father[x] ! x)father[x] find(father[x]);return father[x];}void add(int x1, int x2){int fa1 find(x1), f…...

三步提升IEDA下载速度——修改IDEA中镜像地址

找到IDEA的本地安装地址 D:\tool\IntelliJ IDEA 2022.2.4\plugins\maven\lib\maven3\conf 搜索阿里云maven仓库 复制https://developer.aliyun.com/mvn/guide中红框部分代码 这里也是一样的&#xff1a; <mirror><id>aliyunmaven</id><mirrorOf>*&…...

CentOS7 RPM升级支持BBR TCP/CC的内核版本

列出安装的内核 rpm -qa kernel # yum list installed kernel 删除已安装内核 sudo dnf remove kernel-4.0.4-301.fc22.x86_64 安装内核 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noar…...

文本向量模型BGE与BGE-M3

BGE模型 BGE模型对应的技术报告为《C-Pack: Packaged Resources To Advance General Chinese Embedding》 训练数据 为了训练BGE向量模型&#xff0c;构建了C-MTP数据集&#xff0c;它包括了用来训练文本向量的文本对数据&#xff08;问答对、两个同义句子、相同主题的两个文…...

【黑马头条】-day04自媒体文章审核-阿里云接口-敏感词分析DFA-图像识别OCR-异步调用MQ

文章目录 day4学习内容自媒体文章自动审核今日内容 1 自媒体文章自动审核1.1 审核流程1.2 内容安全第三方接口1.3 引入阿里云内容安全接口1.3.1 添加依赖1.3.2 导入aliyun模块1.3.3 注入Bean测试 2 app端文章保存接口2.1 表结构说明2.2 分布式id2.2.1 分布式id-技术选型2.2.2 雪…...

新能源充电桩站场AI视频智能分析烟火检测方案及技术特点分析

新能源汽车充电起火的原因多种多样&#xff0c;涉及技术、设备、操作等多个方面。从技术层面来看&#xff0c;新能源汽车的电池管理系统可能存在缺陷&#xff0c;导致电池在充电过程中出现过热、短路等问题&#xff0c;从而引发火灾。在设备方面&#xff0c;充电桩的设计和生产…...

springboot集成logback-spring.xml文件

彩色日志日志分debug和error文件输出&#xff0c;方便开发人员运维日志限制最大保管天数日志限制总量大小占用量GB日志限制单个文件大小MB日志显示最大保留天数屏蔽没用的日志 <?xml version"1.0" encoding"UTF-8"?> <!--~ Copyright (c) 2020…...

centos7 安装 nginx

一、yum 方式安装 1.安装yum工具 sudo yum install yum-utils 2. 安装epel yum install epel-release 3.安装nginx&#xff1a; yum install nginx 4.查看版本 nginx -v 5.设置开机自启动 systemctl enable nginx nginx 常用命令&#xff1a; 1&#xff09;启动nginx …...

29. UE5 RPG应用GamplayAbility

前面几篇文章&#xff0c;总算把GE给更新完了&#xff0c;GE的基础应用也算讲清楚了。接下来&#xff0c;我们将更新GA的相应的课程了&#xff0c;首先&#xff0c;这一篇先对GA做一个简单的介绍&#xff0c;然后实现一下如何实现给角色应用一个GA。 简介 GamplayAbility 简称…...

http和https的区别!

HTTP 明文传输&#xff0c;数据都是未加密的&#xff0c;安全性较差&#xff0c;HTTPS&#xff08;SSLHTTP&#xff09; 数据传输过程是加密的&#xff0c;安全性较好。 使用 HTTPS 协议需要到 CA&#xff08;Certificate Authority&#xff0c;数字证书认证机构&#xff09; …...

使用AOP实现打印日志

首先创建annotation.SystemLog类&#xff1a; package com.gjh.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.METHOD…...

2024年新算法-冠豪猪优化算法(CPO),CPO-RF-Adaboost,CPO优化随机森林RF-Adaboost回归预测-附代码

冠豪猪优化算法&#xff08;CPO&#xff09;是一种基于自然界中猪群觅食行为启发的优化算法。该算法模拟了猪群在寻找食物时的集群行为&#xff0c;通过一系列的迭代过程来优化目标函数&#xff0c;以寻找最优解。在这个算法中&#xff0c;猪被分为几个群体&#xff0c;每个群体…...

浅谈高阶智能驾驶-NOA领航辅助的技术与发展

浅谈高阶智能驾驶-NOA领航辅助的技术与发展 附赠自动驾驶学习资料和量产经验&#xff1a;链接 2019年在国内首次试驾特斯拉NOA领航辅助驾驶的时候&#xff0c;当时兴奋的觉得未来已来;2020年在试驾蔚来NOP领航辅助驾驶的时候&#xff0c;顿时不敢小看国内新势力了;现在如果哪家…...

大模型 智能体 智能玩具 智能音箱 构建教程 wukong-robot

视频演示 10:27 一、背景 继上文《ChatGPT+小爱音响能擦出什么火花?》可以看出大伙对AI+硬件的结合十分感兴趣,但上文是针对市场智能音响的AI植入,底层是通过轮询拦截,算是hack兼容,虽然官方有提供开发者接口,也免不了有许多局限性(比如得通过特定指令唤醒),不利于我…...

nas可做网站服务器吗/关键词排名优化易下拉排名

雷帝网 乐天 8月7日报道作为NAND行业的新晋者&#xff0c;长江存储科技有限责任公司&#xff08;简称&#xff1a;长江存储&#xff09;今天公开发布其突破性技术——XtackingTM。据知情人士透露&#xff0c;这之前存储一直都是三星的强项。长江存储称&#xff0c;该技术将为3D…...

新网站怎么让百度收录/关键词排名优化网站

1.2 重定向输出 本文讲的是C语言程序设计进阶教程一1.2 重定向输出,printf函数可能是人们写C程序时最先了解的几个函数之一。著名的“Hello World&#xff01;”程序经常被用作给初学者的例子。在这个计算机程序中&#xff0c;文本被打印至终端。然而在一些场合中&#xff0c…...

泰国网站的域名/黑科技引流软件是真的吗

以下为免安装版MySQL的配置步骤 版本号&#xff1a;mysql-5.7.23-winx64 第一步&#xff1a;进入官网下载免安装MySQL的压缩包 下载地址&#xff1a;点我跳转下载 点击红色框内不登录即可进行下载 第二步&#xff1a;将下载好的压缩包解压到自己创建的文件夹内 解压后点进去…...

wordpress相关文插件/软文模板300字

首先要搞清楚网站是被封还是被惩罚&#xff0c;如果真的被封&#xff0c;原因是什么&#xff1f;如果被封是因为作弊&#xff0c;改一个新的域名一般来说解决不了什么问题。?另一个经常会碰到的问题是&#xff0c;网站被惩罚排名下降应该怎么办&#xff1f;?首先应该确定你的…...

门户网站的注意要素/西安百度推广开户运营

JAVA BaseRepository类下封装了一些方法。 1 新增 int insert(T record) : 插入一条记录&#xff1b; int insertSelective(T record) &#xff1a; 插入一条记录&#xff0c;Bean中null的字段不会被插入&#xff1b; int insertOptional(T record) : 插入一条记录&#xff0c;…...

网站建设公司怎么找客户/做微商怎么找客源加人

微信红包和转账的“区别”&#xff0c;第4个很多人并不知道&#xff0c;网友&#xff1a;不早说&#xff01;众所周知&#xff0c;如今是互联网信息时代&#xff0c;人们的社交生活&#xff0c;也都需要借助一些手机软件来完成&#xff0c;而据数据显示&#xff0c;目前微信的用…...