装饰器模式详解和实现(设计模式 二)

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地将对象添加到现有对象中,以提供额外的功能,同时又不影响其他对象。

实现示例

1.定义一个接口或抽象类,表示被装饰对象的公共接口

//抽象类组件类
public interface Component {void operation();
}

2、创建一个具体的实现类,实现该接口(也就是初始功能的类)

//具体组件类
public class ConcreteComponent implements Component {@Overridepublic void operation() {System.out.println("执行原始操作");//原始功能}
}

3、创建一个装饰器类,实现与被装饰对象相同的接口,并持有一个对被装饰对象的引用

//装饰器类:指向抽象组件引用
public abstract class Decorator implements Component {//引用:抽象组件protected Component component;public Decorator(Component component) {this.component = component;}@Overridepublic void operation() {component.operation();//原始功能}
}

4、创建具体的装饰器类,通过在装饰器类中添加额外的功能来扩展被装饰对象的行为(添加新功能)

//具体装饰器类A
public class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void operation() {super.operation();//原始功能System.out.println("添加额外功能A");}
}
//具体装饰器类B
public class ConcreteDecoratorB extends Decorator {public ConcreteDecoratorB(Component component) {super(component);}@Overridepublic void operation() {super.operation();System.out.println("添加额外功能B");}
}

5、使用新功能(既能使用使用原始功能、也能使用新功能)

public class Main {public static void main(String[] args) {Component component=new ConcreteComponent();//执行原始操作component.operation();System.out.println("--------------------------");//执行额外操作A(包含原始操作)Component componentA=new ConcreteDecoratorA(new ConcreteComponent());componentA.operation();System.out.println("--------------------------");//同时执行额外操作A和B(嵌套)Component componentB=new ConcreteDecoratorB(new ConcreteDecoratorA(new ConcreteComponent()));componentB.operation();}
}

输出结果展示
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式锁:四种方案解决商品超卖的方案

一 分布式锁 1.1 分布式锁的作用 在多线程高并发场景下,为了保证资源的线程安全问题,jdk为我们提供了synchronized关键字和ReentrantLock可重入锁,但是它们只能保证一个工程内的线程安全。在分布式集群、微服务、云原生横行的当下&#xff…

CAA的VS Studio安装

文章目录 一、官网下载VS Studio二、勾选如下安装信息三、更改软件安装位置四、17专业版密钥 一、官网下载VS Studio 官网下载地址: https://visualstudio.microsoft.com/zh-hans/downloads/ 下载对应版本后,以VS Studio2017为例: 二、勾…

[架构之路-228]:计算机硬件与体系结构 - 硬盘存储结构原理:如何表征0和1,即如何存储0和1,如何读数据,如何写数据(修改数据)

目录 前言: 一、磁盘的盘面组成 1.1 磁盘是什么 ​编辑1.2 磁盘存储介质 1.3 磁盘数据的组织 1.3.1 分层组织:盘面号 1.3.2 扇区和磁道 1.3.3 数据 1.3.4 磁盘数据0和1的存储方式 1.3.5 磁盘数据0和1的修正方法 1.3.6 磁盘数据0和1的读 二、…

OpenMMLab【超级视客营】——支持InverseForm Loss(MMSegmentation的第三个PR)

文章目录 1. 任务目标1.1 issue1.2 原理相关资料(论文讲解)InverseFormSTN(Spatial Transformer Networks) 1.3 实现相关资料(相关PR) 2. 理解原理3. 代码实现3.X checklist3.0 Issue中的有效内容3.1 MMSegmentation支持multiple …

使用正则表达式批量修改函数

贪心匹配,替换中的$1代表括号中的第一组。 使用[\s\S\r]代表所有字符,同时加个问号代表不贪心匹配:

【列表渲染+收集表单数据+过滤器+内置指令+自定义指令】

列表渲染收集表单数据过滤器内置指令自定义指令 1 列表渲染1.1 基本列表1.2 key的作用与原理1.3 列表过滤1.4 列表排序1.5 Vue监测数据改变的原理 2 收集表单数据3 过滤器4 内置指令4.1 v-text指令4.2 v-html指令4.3 v-cloak指令4.4 v-once指令4.5 v-pre指令 5 自定义指令 1 列…

计算机组成原理期末复习

第一章 上机前的准备:建立数学模型、确定计算方法和编制解题程序n位操作码有 2 n 2^n 2n种不同操作主储存器(主存/内存)包括存储体M、各种逻辑部件及控制电路。储存体有多个储存单元,储存单元有多个储存元件,每个存储…

水浒传数据集汇总

很喜欢《水浒传》,希望能将它融入我的考研复习中,打算用水浒传数据来贯穿数据结构的各种知识,先汇总下找到的数据集 天池上看到的一个水浒传文本数据集:https://tianchi.aliyun.com/dataset/36027 Hareric/masterworkNLP: 基于社…

《C和指针》笔记33:指针数组

除了创建整型数组一样,也可以声明指针数组。 int *api[10];为了弄清这个复杂的声明,我们假定它是一个表达式,并对它进行求值。下标引用的优先级高于间接访问,所以在这个表达式中,首先执行下标引用。因此,a…

2024级199管理类联考之数学基础(下篇)

平面几何(平均2题) 三角形(性质、特殊三角形、全等与相似) 性质 由不在同一直线的三条线段首尾依次连接所组成的图形三条边、三个内角、三个定点三角形内角和为180度,外角和为360度,多边形的外角和为360度,n多边形的内角和为(n-2)*180度一个外角等于不相邻的两个内角之和任意…

竞赛选题 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 优质竞赛项目系列&#x…

Ubuntu安装samba服务器

为了window系统下能够像访问本地目录一样访问ubuntu系统下的目录,这里我通过安装samba服务器,将ubuntu系统的文件目录通过网络挂载的方式共享出来,以便在window下就能够对ubuntu系统的文件进行读写等访问操作,这里记录一下samba服…