设计模式(4)装饰模式
一、介绍:
1、应用场景:把所需的功能按正确的顺序串联起来进行控制。动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
- 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。
- 当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰模式却很好实现。
- 当对象的功能要求可以动态地添加,也可以再动态地撤销时。
2、类图:
package decorator;
public class DecoratorPattern
{public static void main(String[] args){Component p=new ConcreteComponent();p.operation();System.out.println("---------------------------------");Component d=new ConcreteDecorator(p);d.operation();}
}//1、
//抽象构件角色
interface Component
{public void operation();
}//2、
//具体构件角色
class ConcreteComponent implements Component
{public ConcreteComponent(){System.out.println("创建具体构件角色"); } public void operation(){System.out.println("调用具体构件角色的方法operation()"); }
}//3、
//抽象装饰角色
class Decorator implements Component
{private Component component; public Decorator(Component component){this.component=component;} public void operation(){component.operation();}
}//4、
//具体装饰角色
class ConcreteDecorator extends Decorator
{public ConcreteDecorator(Component component){super(component);} public void operation(){super.operation();addedFunction();}public void addedFunction(){System.out.println("为具体构件角色增加额外的功能addedFunction()"); }
}
3、装饰模式简化: 装饰模式所包含的 4 个角色不是任何时候都要存在的,在有些应用环境下模式是可以简化的,如以下两种情况。
(1)如果只有一个具体构件而没有抽象构件时,可以让抽象装饰继承具体构件。如人穿衣服,没必要写Component类,可以让服饰类Decorator继承人类ConcreteComponent即可。
(2) 如果只有一个具体装饰时,可以将抽象装饰和具体装饰合并
二、实例:
1、装饰模式在 Java 语言中的最著名的应用莫过于 Java I/O 标准库的设计了。例如,InputStream 的子类 FilterInputStream,OutputStream 的子类 FilterOutputStream,Reader 的子类 BufferedReader 以及 FilterReader,还有 Writer 的子类 BufferedWriter、FilterWriter 以及 PrintWriter 等,它们都是抽象装饰类。
BufferedReader in=new BufferedReader(new FileReader("filename.txtn));
String s=in.readLine();
2、游戏中的变身,组合服装;
3、房子装修;
相关文章:
设计模式(4)装饰模式
一、介绍: 1、应用场景:把所需的功能按正确的顺序串联起来进行控制。动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法…...
Redis——通用命令介绍
Redis官方文档 redis官方文档 核心命令 set 将key和value存储到Redis中,key和value都是字符串 set key valueRedis中不区分大小写,字符串类型也不需要添加单引号或者双引号 get 根据key读取value,如果当前key不存在,则返回…...
EmberJS教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 Ember.js 是一个开源 JavaScript框架,用于开发基于模型-视图-控制器( MVC)架构的大型客户端 Web 应用程序。 Ember 旨在减少开发时间和提高生产力,它是全球采用的增长最快的前端应用程序框架之一。它目前在许多网站上使用,例如 Squ…...
Diffusion扩散模型学习4——Stable Diffusion原理解析-inpaint修复图片为例
Diffusion扩散模型学习4——Stable Diffusion原理解析-inpaint修复图片为例 学习前言源码下载地址原理解析一、先验知识二、什么是inpaint三、Stable Diffusion中的inpaint1、开源的inpaint模型2、基于base模型inpaint 四、inpaint流程1、输入图片到隐空间的编码2、文本编码3、…...
dns的负载分配是什么
DNS 负载分配是使用 DNS 系统对传入的网络流量进行分配的一种技术。这可以是基于多种策略来分配的,从简单的轮询到更复杂的基于地理位置或服务器健康状况的分配。下面是 DNS 负载分配的几种常见形式: 轮询(Round Robin)࿱…...
adb 通过wifi连接手机
adb 通过wifi连接手机 1. 电脑通过USB线连接手机2. 手机开启USB调试模式,开启手机开发者模式3.手机开启USB调试模式 更多设置-》开发者选项-》USB调试4.点击Wi-Fi 高级设置,可以查看到手机Wi-Fi的IP地址,此IP地址adb命令后面的ip地址…...
将应用设置成系统App/获取Android设备SN号
1,和系统签名一致;(签名设置签名文件) 2,配置Manifest 至此你的App就是一个系统App了,可以执行一些系统App才能有的操作,如获取机器SN号: public String getSerialNumber() {Strin…...
2.CUDA 编程手册中文版---编程模型
2.编程模型 更多精彩内容,请扫描下方二维码或者访问https://developer.nvidia.com/zh-cn/developer-program 来加入NVIDIA开发者计划 本章通过概述CUDA编程模型是如何在c中公开的,来介绍CUDA的主要概念。 编程接口中给出了对 CUDA C 的广泛描述。 本章…...
Claude 2、ChatGPT、Google Bard优劣势比较
Claude 2: 优势:Claude 2能够一次性处理多达10万个tokens(约7.5万个单词)。 tokens数量反映了模型可以处理的文本长度和上下文数量。tokens越多,模型理解语义的能力就越强)。它在法律、数学和编码等多个…...
Docker安装Hadoop分布式集群
一、准备环境 docker search hadoop docker pull sequenceiq/hadoop-docker docker images二、Hadoop集群搭建 1. 运行hadoop102容器 docker run --name hadoop102 -d -h hadoop102 -p 9870:9870 -p 19888:19888 -v /opt/data/hadoop:/opt/data/hadoop sequenceiq/hadoop-do…...
文盘 Rust -- tokio 绑定 cpu 实践
tokio 是 rust 生态中流行的异步运行时框架。在实际生产中我们如果希望 tokio 应用程序与特定的 cpu core 绑定该怎么处理呢?这次我们来聊聊这个话题。 首先我们先写一段简单的多任务程序。 use tokio::runtime; pub fn main() {let rt runtime::Builder::new_mu…...
微服务Ribbon-负载均衡策略和饥饿加载
目录 一、负载均衡策略 1.1 负载均衡策略介绍 1.2 自定义负载均衡策略 二、饥饿加载 (笔记整理自bilibili黑马程序员课程) 一、负载均衡策略 1.1 负载均衡策略介绍 负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类&…...
uni-app 运行时报错“本应用使用HBuilderX x.x.x 或对应的cli版本编译,而手机端SDK版本是x.x.x。不匹配的版本可能造成应用异常”
uni-app 运行时报错“本应用使用HBuilderX x.x.x 或对应的cli版本编译,而手机端SDK版本是x.x.x。不匹配的版本可能造成应用异常” 出现原因 手机端SDK版本和HBuilderX版本不一致。 解决办法 方法一 项目根目录下找到 manifest.json 配置文件,选择源码…...
Windows使用docker desktop 安装kafka、zookeeper集群
docker-compose安装zookeeper集群 参考文章:http://t.csdn.cn/TtTYI https://blog.csdn.net/u010416101/article/details/122803105?spm1001.2014.3001.5501 准备工作: 在开始新建集群之前,新建好文件夹,用来挂载kafka、z…...
11 | 苹果十年财报分析
在本文中,我们将对苹果公司的财务报告进行深入分析,关注其销售收入、利润情况以及关键产品线的表现。我们将研究财报中的数据,挖掘背后的商业策略和市场动态,以便更好地了解苹果公司在不同市场环境下的业绩表现。通过对财报数据的解读和分析,我们将探讨苹果公司在竞争激烈…...
Zookeeper与Redis 对比
1. 为什么使用分布式锁? 使用分布式锁的目的,是为了保证同一时间只有一个 JVM 进程可以对共享资源进行操作。 根据锁的用途可以细分为以下两类: 1、 允许多个客户端操作共享资源,我们称为共享锁。 这种锁的一般是对共享资源具有幂…...
跨境商城服务平台搭建与开发(金融服务+税务管理)
随着全球电子商务的快速发展,跨境贸易已经成为一种新的商业趋势。在这个背景下,搭建一个跨境商城服务平台,提供金融服务、税务管理等一系列服务,可以极大地促进跨境贸易的发展。本文将详细阐述跨境商城服务平台搭建与开发的步骤。…...
docker配置文件
/etc/docker/daemon.json 文件作用 /etc/docker/daemon.json 文件是 Docker 配置文件,用于配置 Docker 守护进程的行为和参数。Docker 守护进程是负责管理和运行 Docker 容器的后台进程,通过修改 daemon.json 文件,可以对 Docker 守护进程进…...
Mysql数据库之单表查询
目录 一、练习时先导入数据如下: 二、查询验证导入是否成功 三、单表查询 四、where和having的区别 一、练习时先导入数据如下: 素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 CRE…...
macos搭建appium-iOS自动化测试环境
目录 准备工作 安装必需的软件 安装appium 安装XCode 下载WDA工程 配置WDA工程 搭建appiumwda自动化环境 第一步:启动通过xcodebuild命令启动wda服务 分享一下如何在mac电脑上搭建一个完整的appium自动化测试环境 准备工作 前期需要准备的设备和账号&…...
V7K 数据收集
V7000的故障数据收集1. 通过GUI图形管理界面Download Support Package是基本的数据收集方式 选择Troubleshooting菜单下面的“Support” 注意: 微码6.3下,应选择Settings菜单下面的“Support”。点击“Download Support Package” 有4个选项可…...
2026年三角洲俱乐部3×3保险箱:守护私密空间的智能选择
在《三角洲行动》这款充满策略与竞技的游戏中,无论是珍贵的“暗星燃料”、“勇者之证”,还是辛苦积累的“哈夫币”,都是玩家心血的结晶。如何安全、便捷地管理这些虚拟资产,成为许多玩家,尤其是高端玩家和团队管理者关…...
阿联酋科技创新研究院:单模型实现多视觉任务统一解决突破
这项由阿联酋科技创新研究院(Technology Innovation Institute,TII)Falcon Vision团队主导的研究发表于2026年3月,论文编号为arXiv:2603.27365v1。有兴趣深入了解的读者可以通过该编号在相关学术平台查询完整论文内容。传统的计算…...
别再踩坑了!SQL Server数据类型那点事儿,看懂这篇少背三个锅竟
从0构建WAV文件:读懂计算机文件的本质 虽然接触计算机有一段时间了,但是我的视野一直局限于一个较小的范围之内,往往只能看到于算法竞赛相关的内容,计算机各种文件在我看来十分复杂,认为构建他们并能达到目的是一件困难…...
2026论文降AIGC保姆级指南:从80%降到10%,这5款降ai率工具亲测好用(附去AI味心法)
2026各校对AIGC越来越严格,但其实只要方法对,降下来也没那么难。 为了帮大家降低ai率,我把市面上的十几款主流降AI工具都试了一遍,今天这篇就给大家分享一下,如何在保留正常逻辑的前提下,将AI率降到学校要…...
从零入门性能测试:理论+JMETER实操,看完就能上手婪
一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库,无需依赖 Microsoft Word,支持 Word 文档的创建、编辑、转换等操作,其中内置的 Markdown 解析能力,能高效实现 Markdown 到 Doc/Docx 格式的转换,且…...
一篇文章带你了解MyBatis!!!
一、引言在之前提到的三层架构:控制层controller、业务层service、持久层dao,里面的持久层,顾名思义:承担了数据持久化的核心职责;这篇文章讲述的是常用的持久层框架---MyBatis二、入门程序准备工作:创建sp…...
毕业设计实战:基于SSM+MySQL的校园兼职管理系统设计与实现指南
毕业设计实战:基于SSMMySQL的校园兼职管理系统设计与实现指南 在开发“基于SSMMySQL的校园兼职管理系统”毕业设计时,曾因简历投递表未通过用户ID与兼职招聘ID双外键关联踩过关键坑——初期仅设计投递编号、投递时间等基础字段,未与用户表、兼…...
7脚 LED数码屏的刷新显示,乱码请指正
我是新手近段时间的工作是点亮7脚LED数码屏,刷新时遇到了困惑请大家帮助指正,在此表示非常感谢。 下面是7脚LED数码屏结构图。 用了7个 case下面是刷新代码switch(ScanPinNum){// ---------------- CASE1: PIN1------------------------case 1: …...
彻底搞懂词元(Token)!小白科普,看完再也不懵
不管是用ChatGPT、豆包这类AI工具,还是刷AI相关的科普内容,你一定绕不开一个词——词元(Token)。 “AI生成内容有词元(Token)限制”“付费按词元(Token)计价”“训练AI要先分词元&a…...
