装饰模式Decorator

news2024/12/29 8:43:34

1.意图:动态地给一个对象添加一些额外职责。就增加功能而言,Decorator模式比生成子类更加灵活。
2.结构
在这里插入图片描述

Component定义一个对象接口,可以给这些对象动态地添加职责;
ConcreteComponent定义一个对象,可以给这个对象添加一些职责;
Decorator维持一个指向Component对象的指针,并定义一个于Component接口一致的接口;
ConcreteDecorator向组件添加职责。
3.适用性:
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;
处理那些可以撤销的职责;
当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或类定义不能用于生成子类。
代码案例
某发票Invoice由抬头Head部分、正文部分和脚注Foot部分构成。现采用装饰Decorator模式实现打印发票的功能。
软件设计师考试2016年下半年下午题第6题

/**
 * 装饰模式
 */
class Invoice{
    public void printInvoice(){
        System.out.println("This is the content of the invoice!");
    }
}

class Decorator extends Invoice{
    protected Invoice ticket;
    public Decorator (Invoice t){
        ticket = t;
    }
    public void printInvoice(){
        if(ticket!=null) {
            ticket.printInvoice();
        }
    }
}
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();
    }
}
class FootDecorator extends Decorator{
    public FootDecorator(Invoice t) {
        super(t);
    }
    public void printInvoice(){
        super.printInvoice();
        System.out.println("This is the foot of the invoice!");
    }
}
class Test{
    public static void main(String[] args) {
        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();
    }
}

运行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]JAVA毕业设计六如文学网站(系统+LW)

[附源码]JAVA毕业设计六如文学网站(系统LW) 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术:…

康力源在创业板提交注册:预计全年收入同比下滑,衡墩建持股98%

12月4日,江苏康力源体育科技股份有限公司(下称“康力源”)在深圳证券交易所创业板提交招股书(注册稿)。据贝多财经了解,康力源于2021年11月12日在创业板递交招股书,2022年8月11日获得上市委会议…

螺旋矩阵||真的很有趣!(蓝桥杯宝贝们看过来)

献丑了&#xff0c;画了个图&#xff0c;如果图看不同&#xff0c;没关系&#xff0c;我们还有注释 class Solution { public:vector<vector<int> > generateMatrix(int n) {vector<vector<int> >num(n,vector<int>(n,0)); int startX0,startY0;…

向黑客精神致敬!

不是第一次想在一个特殊的时间写点什么&#xff0c;但是每次都是刚写了几个字就又停下来&#xff0c;有什么好说的呢&#xff1f;既然整个行业都是说的多&#xff0c;做的少&#xff0c;我们不如更多的踏实做点事情比较好&#xff0c;所以又把编辑器关掉。 但这次还是希望能和大…

Java 最常见的800道面试题,老话说:临阵磨枪,不快也光,涨薪指日可待

前言 春招&#xff0c;秋招&#xff0c;社招&#xff0c;我们 Java 程序员的面试之路&#xff0c;是挺难的&#xff0c;过了 HR&#xff0c;还得被技术面&#xff0c;鄙人在去各个厂面试的时候&#xff0c;经常是通宵睡不着觉&#xff0c;头发都脱了一大把&#xff0c;还好最终…

kubernetespod控制器详解2与service详解1

kubernetespod控制器详解2与service详解1 Horizontal Pod Autoscaler(HPA) Kubernetes期望可以实现通过监测Pod的使用情况&#xff0c;实现pod数量的自动调整&#xff0c;于是就产生了Horizontal Pod Autoscaler&#xff08;HPA&#xff09;这种控制器。 HPA可以获取每个Pod利…

【并发】J.U.C之Java锁

java锁 锁的种类和特点 无锁/偏向锁/轻量级锁/重量级锁 这四种锁是指锁的状态&#xff0c;专门针对synchronized的。在介绍这四种锁状态之前还需要介绍一些额外的知识。 首先为什么Synchronized能实现线程同步&#xff1f; 在回答这个问题之前我们需要了解两个重要的概念&a…

室外定位:高精度北斗RTK定位技术

北斗RTK定位技术&#xff0c;也称北斗差分定位技术&#xff0c;利用我国自主研发的北斗卫星定位系统实现精确定位功能。定位精度可根据需要&#xff0c;通过选择不同精度的人员定位终端来实现。 在科技强国的战略驱动下&#xff0c;北斗RTK定位技术迎来了广阔的发展机遇&#x…

【无锁队列】无锁CAS_无锁队列

1 引言 锁是解决并发问题的万能钥匙&#xff0c;可是并发问题只有锁能解决吗&#xff1f; 2 什么是CAS&#xff1f; ⽐较并交换(compare and swap, CAS)&#xff0c;是原⼦操作的⼀种&#xff0c;可⽤于在多线程编程中实现不被打断的数据交换操作&#xff0c;从⽽避免多线程…

[附源码]计算机毕业设计基于Springboot的专业技能认证系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Thread类的常用方法

目录 1.Thread类常用的构造方法 2.Thread类的几个常见属性 2.1 什么是守护线程?isDaemon 2.2线程是否存活 isAliye() 3.终止线程的方法 3.1使用共享标志位通知中断线程 3.2使用Thread自带的标志位通知 4.等待线程 join 5.获取当前线程的引用 6.休眠当前线程 Thread …

Java安全--篇2-类的动态加载

类的动态加载 首先我们来了解一下构造代码块和静态代码块&#xff1a;Java中静态代码块、构造代码块、构造函数、普通代码块 - YSOcean - 博客园 // 静态代码块 static {System.out.println("静态代码块"); }// 构造代码块 {System.out.println("构造代码块&q…

使用Jetpack组件Navigation实现Android开发中页面跳转

使用Jetpack组件Navigation实现Android开发中页面跳转 ​目录 一、前言 1.概述 2.导航图的创建&#xff08;官网&#xff09; 二、基本使用 1.依赖配置 2.具体实例&#xff1a;使用Navigation实现页面的跳转。 2.1.class的创建 2.2 、页面布局文件的创建 2.3 向 Acti…

Abaqus血管支架仿真攻略之几何创建与网格划分

作者&#xff1a;江丙云&#xff0c;仿真秀平台优秀讲师 前不久&#xff0c;笔者推送的冠脉支架的参数化建模和优化、Abaqus网格卷曲WrapMesh&#xff0c;冠脉支架的参数化建模和优化&#xff0c;以及Abaqus疲劳分析|Goodman插件等原创文章后&#xff0c;后台留言的读者众多&a…

GDP-海藻糖,5‘-鸟苷二磷酸岩藻糖,GDP-fucose ,CAS:15839-70-0

产品名称&#xff1a;GDP-海藻糖&#xff0c;5-鸟苷二磷酸岩藻糖&#xff0c;二磷酸鸟苷岩藻糖&#xff0c;GDP-L-岩藻糖 英文名称&#xff1a;GDP-fucose&#xff0c;Guanosine 5-diphosphate-L-fucose disodium salt CAS&#xff1a;15839-70-0 Mol. Formula C16H23N5O…

基于模糊神经网络算法预测电价(Matlab代码实现)

&#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;⛳️⛳️⛳️ ​ 目录 1 概述 2 模糊神经网络简介 3 运行结果 4 参考文献 5 Matlab代码实现 1 概述 近年来,随着能源短缺和环境问题的日益凸显,太阳能、风能等各种形式的清洁能源得到广泛应用,微网作为分布式…

【云原生 | 46】高可用的开源键值数据库Etcd的安装与使用

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

第二证券|超300家机构关注两大赛道龙头,透露市场增长及发展方向

中科创达、奥普特成为本周调研组织数量最多的两家公司。 智能操作体系龙头获365家组织调研 证券时报数据宝计算&#xff0c;11月27日至12月3日&#xff0c;组织算计调研上市公司291家。被调研方多属于电子、机械设备、医药生物、电力设备、计算机、国防军工等板块&#xff0c;…

安卓属性动画

​ 一&#xff0e;三种安卓动画 Tween Animation(补间动画、视图动画)&#xff1a;通过对场景里的对象不断做图像变换&#xff08;平移、缩放、旋转&#xff09;产生的动画效果&#xff0c;即是一种渐变动画。 Frame Animation(帧动画)&#xff1a;顺序播放事先做好的图像&…

基于PLC的工业晾晒架系统

目录 前言 6 第一章 工业晾晒架的发展现状及趋势 7 1.1自动工业晾晒架的基本介绍 7 1.2自动工业晾晒架发展史和发展现状 8 第二章 自动晾晒架的智能模块 9 2.1自动晾晒架的结构框图 9 2.2自动晾晒架的机械理论 10 第三章 自动晾晒架的硬件设计 11 3.1电源设计部分 12 3.2 PLC的…