当前位置: 首页 > 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;问答对、两个同义句子、相同主题的两个文…...

OnmyojiAutoScript:阴阳师自动化脚本终极指南,20+日常任务一键托管解放双手

OnmyojiAutoScript&#xff1a;阴阳师自动化脚本终极指南&#xff0c;20日常任务一键托管解放双手 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 还在为阴阳师中重复繁琐的日常…...

汽车存储技术演进:从边缘计算到车规级设计的核心挑战与选型指南

1. 汽车存储需求变迁&#xff1a;从机械心脏到数字大脑二十年前&#xff0c;我们选车看的是发动机的轰鸣、变速箱的平顺和底盘的扎实。如今&#xff0c;走进4S店&#xff0c;销售顾问会先带你坐进驾驶舱&#xff0c;点亮那块巨大的中控屏&#xff0c;演示语音助手、在线导航、高…...

面试记录 (2026/5/12)

问题一&#xff1a;java并发包下的AQS,了解多少&#xff1f; 这个真是没看过源码&#xff0c;就不班门弄斧了 直接学习下 大佬的经验 https://blog.csdn.net/qq_45772447/article/details/149126295?fromshareblogdetail&sharetypeblogdetail&sharerId149126295&…...

锂电池热失控防护:从封装技术到系统级安全设计

1. 从三星Note 7到航天器&#xff1a;锂电池安全问题的根源与演进2016年&#xff0c;三星Galaxy Note 7的“燃损门”事件&#xff0c;将锂电池安全问题以一种极其戏剧化且代价高昂的方式&#xff0c;推到了全球消费者和整个电子产业的聚光灯下。官方调查最终指向了电池设计缺陷…...

从电视伴音收音机消亡看数字技术演进与仪器集成化趋势

1. 从一台“电视伴音收音机”说起&#xff1a;一个时代的消逝与技术演进的注脚我书桌抽屉的角落里&#xff0c;一直躺着一台老旧的收音机。它不是普通的AM/FM收音机&#xff0c;在它的波段选择旋钮上&#xff0c;除了熟悉的“AM”和“FM”&#xff0c;还有一个略显神秘的“TV”…...

从网易招聘看技术人择校与城市选择:一线城市VS武汉,哪里机会更多?

技术人择校与城市选择指南&#xff1a;数据驱动的职业发展决策 站在高考志愿填报或考研择校的十字路口&#xff0c;每个怀揣技术梦想的年轻人都面临着一个关键抉择&#xff1a;是追逐一线城市的产业聚集效应&#xff0c;还是选择武汉这类高校密集但名企较少的城市&#xff1f;这…...

收藏这篇就够了!日薪 2700 护网 HW 面试攻略,2026 护网全流程提前吃透

前言 参与hvv的事情还是要想办法规避掉很多坑的。网络安全这个行业现阶段还是主要政策驱动&#xff0c;后面应该是客户意识&#xff0c;现在用户教育成本明显比以前低太多。 1.关于HVV的一个简单流程 首先我带大家从甲方和厂商的角度来分解一下整个护网流程的核心逻辑 第一阶段…...

构建AI智能体技能超市:标准化工作流与多平台适配实践

1. 项目概述&#xff1a;一个面向AI智能体的“技能超市”如果你和我一样&#xff0c;每天都在和Codex、Claude、Cursor这些AI助手打交道&#xff0c;那你肯定也遇到过这样的场景&#xff1a;想让AI帮你生成一份规范的Git提交信息、自动更新文档索引&#xff0c;或者为一个新项目…...

LLM RAG还值得做吗?今天一下就顿悟了

在企业级AI应用领域&#xff0c;RAG&#xff08;检索增强生成&#xff09;不仅值得深耕&#xff0c;更是当前唯一能站稳脚跟的核心护城河。曾有人断言长上下文窗口&#xff08;Long Context&#xff09;会取代RAG&#xff0c;但这一说法早在2024年就被彻底证伪&#xff0c;进入…...

Faust.js实战:用Next.js构建高性能Headless WordPress前端

1. 项目概述&#xff1a;当WordPress遇见现代前端如果你和我一样&#xff0c;在过去几年里深度参与过企业级WordPress项目&#xff0c;那你一定对那个经典的“两难困境”记忆犹新&#xff1a;一方面&#xff0c;WordPress的后台管理体验和内容生态无可匹敌&#xff0c;是内容团…...