设计模式-装饰器模式

        装饰器模式(Decorator Pattern)是一种设计模式,它允许在运行时动态地给一个对象添加额外的功能,而不需要修改原始对象的结构。

        在Java中,装饰器模式可以通过以下方式实现:

        1. 创建一个接口(Component),定义了原始对象和装饰器对象的共同行为。

        2. 创建一个具体的实现类(ConcreteComponent),实现了接口,并提供了原始对象的具体实现。

        3. 创建一个装饰器类(Decorator),实现了接口,并包含一个对Component对象的引用。装饰器类可以在调用原始对象的方法之前或之后添加额外的功能。

        4. 创建具体的装饰器类(具体的Decorator类),继承自装饰器类,并在调用原始对象的方法之前或之后添加特定的功能。

        以下是一个简单的示例代码,演示了如何使用装饰器模式:

// 接口
interface Shape {void draw();
}// 具体实现类
class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a circle");}
}// 装饰器类
abstract class ShapeDecorator implements Shape {protected Shape decoratedShape;public ShapeDecorator(Shape decoratedShape) {this.decoratedShape = decoratedShape;}@Overridepublic void draw() {decoratedShape.draw();}
}// 具体的装饰器类
class RedShapeDecorator extends ShapeDecorator {public RedShapeDecorator(Shape decoratedShape) {super(decoratedShape);}@Overridepublic void draw() {decoratedShape.draw();setRedBorder();}private void setRedBorder() {System.out.println("Setting red border");}
}// 客户端
public class Main {public static void main(String[] args) {Shape circle = new Circle();Shape redCircle = new RedShapeDecorator(new Circle());circle.draw();System.out.println("---");redCircle.draw();}
}

        在这个示例中,Shape接口定义了原始对象和装饰器对象的共同行为。Circle类是具体的实现类,实现了Shape接口,并提供了原始对象的具体实现。

        ShapeDecorator类是装饰器类,实现了Shape接口,并包含一个对Component对象的引用。在draw方法中,装饰器类调用原始对象的draw方法。

        RedShapeDecorator类是具体的装饰器类,继承自装饰器类,并在调用原始对象的draw方法之前或之后添加特定的功能。在这个示例中,RedShapeDecorator类在调用原始对象的draw方法之后,添加了设置红色边框的功能。

        在客户端中,通过实例化具体的装饰器类来使用装饰器模式。客户端可以选择性地添加多个装饰器,以实现不同的功能组合。

        装饰器模式允许在运行时动态地给一个对象添加额外的功能,而不需要修改原始对象的结构。这提供了更大的灵活性和可扩展性,同时遵循了开闭原则。

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

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

相关文章

从实时数据库转战时序数据库,他陪伴 TDengine 从 1.0 走到 3.0

关于采访嘉宾 在关胜亮的学生时代,“神童”这个称号如影随形,很多人初听时会觉得这个称谓略显夸张,有些人还会认为这是不是就是一种调侃,但是如果你听说过他的经历,就会理解这一称号的意义所在了。 受到教师母亲的影…

处理sass-loader安装失败

Vue项目中安装node-sass跟sass-loader 我们在开发中,经常会使用sass语法来编写css,在安装node-sass和sass-loader时,经常会出现错误(通常是依赖冲突)导致安装失败。因为官方发布的版本号并不是连续的,有些版本与版本之…

【ssh_config】SSH中配置多个private key

当要使用多个不同的private key登录不同的主机时,我们可以在ssh命令里面用-i参数指定每次使用的private key文件。 但是这样做比较发麻而且容易出错,我们可以利用~/.ssh/config文件,在让ssh自动为我们决定应该使用哪个key。 基本方法 最简单…

ESRI ArcGIS Desktop 10.8.2图文安装教程及下载

ArcGIS 是由美国著名的地理信息系统公司 Esri 开发的一款地理信息系统软件,它是目前全球最流行的 GIS 软件之一。ArcGIS 提供了图形化用户界面和数据分析工具,可以帮助用户管理、分析和可视化各种空间数据。ArcGIS Desktop是一个完整的桌面GIS软件套件&a…

【软件安装】docker 安装 elasticsearch 和 kibana

首先根据需要选择相应的版本号,然后分别执行下面的脚本 install_elasticsearch.sh docker run -it --name es_710 \-p 9200:9200 \-p 9300:9300 \-e "discovery.typesingle-node" \-e ES_JAVA_OPTS"-Xms5g -Xmx10g" \-e "TAKE_FILE_OWNE…

JVMGC复习

TLAB:默认给每一个线程开辟一块内存空间存放线程自己的对象 Class对象是存放在堆区的,不是方法区,类的元数据元数据并不是类的Class对象,Class对象是加载的最终产品,类的方法代码,变量名,方法名&#xff0c…

【黑马程序员】机器学习

(一)机器学习概述 一、机器学习算法分类 1、监督学习: (1)目标值是类别:分类问题 k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归 (2)目标值是连续型的数据:回归…

微信小程序进阶——后台交互

目录 一、后台准备 1.1 pom.xml 1.2 配置数据源 1.3 整合mybatis 二、前后端交互 2.1 method1 2.2 method2 2.2.1 封装request 2.2.2 头部引用util 2.2.3 编写方法 2.2.4 展示效果 三、WXS的使用 3.1 会议状态 3.1.2 引入wxs 3.1.3 修改代码 3.1.4 展示效果 3…

【python】进程和线程

进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的执行&#xff…

WuThreat身份安全云-TVD每日漏洞情报-2023-10-12

漏洞名称:curl SOCKS5 堆溢出漏洞(CVE-2023-38545) 漏洞级别:高危 漏洞编号:CVE-2023-38545,CNVD-2023-75809 相关涉及:cURL libcurl >7.69.0&#xff0c;<8.3.0 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-25382 漏洞名称:Apache H…

关于 Invalid bound statement (not found): 错误的解决

关于 Invalid bound statement not found: 错误的解决 前言错误原因解决方法1. 检查SQL映射文件2. 检查MyBatis配置3. 检查SQL语句4. 检查命名约定5. 清除缓存6. 启用日志记录 重点注意 结语 我是将军我一直都在&#xff0c;。&#xff01; 前言 当开发Java Spring Boot应用程…

自然语言处理基础

自然语言 自然语言处理是人工智能能够通过图灵测试的重要工具。 自然语言处理基本的任务和应用 词性标注&#xff1a;把每句话的各个单词的词性标注出来&#xff0c;例如&#xff1a;形容词、名词、动词 named entity recognition命名实体的识别&#xff1a;识别哪些单词是真…

小程序OCR身份证识别

使用两种OCR识别&#xff1a;小程序和腾讯云 1.基于微信小程序OCR插件实现身份证拍照、上传并OCR识别的示例&#xff1a; 首先&#xff0c;在小程序中添加身份证拍照的功能&#xff0c;可以使用wx.chooseImage()选择照片并使用wx.uploadFile()上传&#xff0c;代码如下&#…

Service Mesh和Kubernetes:加强微服务的通信与安全性

文章目录 什么是Service Mesh&#xff1f;Service Mesh的优势1. 流量控制2. 安全性3. 可观测性 Istio&#xff1a;Service Mesh的领军者流量管理安全性可观测性 Linkerd&#xff1a;轻量级Service Mesh流量管理安全性可观测性 Istio vs. Linkerd实际应用结论 &#x1f388;个人…

小度打头阵,百度大模型能否“赋能万物”?

文 | 智能相对论 作者 | 楷楷 近日&#xff0c;百度集团副总裁、小度科技原CEO景鲲因个人原因辞任&#xff0c;百度集团副总裁、首席信息官&#xff08;CIO&#xff09;李莹轮岗出任小度科技CEO&#xff0c;并向李彦宏直接汇报。 随着“景鲲时代”落幕&#xff0c;新任CEO李…

动态规划14(Leetcode516最长回文子序列)

代码&#xff1a; class Solution {public int longestPalindromeSubseq(String s) {int n s.length();int[][] dp new int[n][n];for(int in-1;i>0;i--){dp[i][i] 1;char c1 s.charAt(i);for(int ji1;j<n;j){char c2 s.charAt(j);if(c1c2){dp[i][j] dp[i1][j-1]2…

2023年中国档案信息化发展历程、竞争格局及行业市场规模分析[图]

档案信息化是以网络、计算机、信息技术为手段&#xff0c;以档案资源为对象&#xff0c;以档案工作为依托&#xff0c;以档案管理学最新理论为指导&#xff0c;按照信息社会和国家档案行政管理部门的要求、开展档案的收集、整理、保管、开发和利用的现代化管理过程。 档案信息化…

[SQL开发笔记]INSERT INTO 语句:将新记录插入到数据库表中

目前&#xff0c;向数据库插入数据是数据管理的重要环节&#xff0c;它可以将数据长期保存、共享访问、保证数据的完整性和安全性&#xff0c;同时也是进行数据检索和分析的基础。其中&#xff0c;INSERT INTO 语句是SQL&#xff08;结构化查询语言&#xff09;中用于向数据库表…

vue-router 路由模式有几种?

Vue Router 提供了三种路由模式: 1:Hash 模式(默认): 在 URL 中使用带有 # 符号的哈希值来管理路由。例如:http://xxxx.com/#/path。 在 Hash 模式下,当 URL 的哈希值发生变化时,浏览器不会向服务器发送请求,而是通过监听 hashchange 事件来进行路由导航。 2:Hist…

k8s day06

污点通常情况下是作用在worker节点上&#xff0c;其可以影响Pod的调度。 污点的语法格式如下: key[value]:effect 相关字段说明: key: 字母或数字开头&#xff0c;可以包含字母、数字、连字符(-)、点(.)和下划线(_)&#xff0c;最多253个字符。 …