当前位置: 首页 > news >正文

【设计模式】装饰者模式

目录

        • 一、定义
        • 二、结构
        • 三、优点
        • 四、使用场景
        • 五、代码示例
        • 六、截图示例

一、定义

  • 1.在不改变现有对象结构的情况下,动态给该对象添加额外功能的模式
  • 2.类B继承于类A,并将类A作为B类的属性(B类聚合A类)
  • 3.BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter都用到了装饰者模式

二、结构

  • 1.抽象构件角色(Component):定义一个抽象接口以规范准备接收附加责任的对象
  • 2.具体构件角色(Concrete Component):实现抽象构件,通过装饰角色为其添加一些职责
  • 3.抽象装饰角色(Decorator):继承或实现抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能
  • 4.具体装饰角色(ConcreteDecorator):实现抽象装饰的相关方法,并给具体构件对象添加附加的责任

三、优点

  • 1.装饰者模式可以带来比继承更加灵活性的扩展功能,使用更加方便,可以通过组合不同的装饰者对象来获取具有不同行为状态的多样化结果
  • 2.装饰者模式比继承更具良好的扩展性,完美的遵循开闭原则,继承是静态的附加责任,装饰者则是动态的附加责任
  • 3.装饰类和被装饰类可以独立发展,不会互相耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能

四、使用场景

  • 1.当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时
  • 2.不能采用继承的情况主要有两类:1.系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;2.类定义不能被继承(例如被final修饰的类)
  • 3.在不影响其它对象情况下,以动态、透明的方式给单个对象添加职责
  • 4.当对象的功能要求可以动态添加,也可以动态撤销时

五、代码示例

package com.learning.decorator;import lombok.AllArgsConstructor;
import lombok.Data;/*** 抽象构件角色* 快餐类*/
@Data
@AllArgsConstructor
public abstract class FastFood {// 价格private float price;// 名称private String name;public abstract float cost();public void printFastFood(){System.out.println(this.getName() + " " + this.cost());}
}
package com.learning.decorator;/*** 炒饭类* 具体构件角色*/
public class FriedRice extends FastFood{public FriedRice(){super(10, "炒饭");}@Overridepublic float cost() {return getPrice();}
}
package com.learning.decorator;/*** 炒面类* 具体构件角色*/
public class FriedNoodles extends FastFood{public FriedNoodles(){super(12, "炒面");}@Overridepublic float cost() {return getPrice();}
}
package com.learning.decorator;import lombok.Getter;
import lombok.Setter;/*** 装饰者类* 抽象装饰者角色*/
@Setter
@Getter
public abstract class Garnish extends FastFood{// 声明快餐类的变量private FastFood fastFood;public Garnish(FastFood fastFood, float price, String name) {super(price, name);this.fastFood = fastFood;}
}
package com.learning.decorator;/*** 鸡蛋类* 具体的装饰者角色*/
public class Egg extends Garnish{public Egg(FastFood fastFood){super(fastFood, 1, "鸡蛋");}@Overridepublic float cost() {// 计算价格return getFastFood().cost() + this.getPrice();}@Overridepublic String getName() {return super.getName() + getFastFood().getName();}
}
package com.learning.decorator;/*** 培根类* 具体的装饰者角色*/
public class Bacon extends Garnish{public Bacon(FastFood fastFood){super(fastFood, 1, "培根");}@Overridepublic float cost() {// 计算价格return getFastFood().cost() + this.getPrice();}@Overridepublic String getName() {return super.getName() + getFastFood().getName();}
}
package com.learning.decorator;public class Client {public static void main(String[] args) {FastFood fastFood = new FriedRice();// 点一份炒饭fastFood.printFastFood();// 炒饭中添加鸡蛋fastFood = new Egg(fastFood);fastFood.printFastFood();// 鸡蛋炒饭中加培根fastFood = new Bacon(fastFood);fastFood.printFastFood();// 再加一个鸡蛋fastFood = new Egg(fastFood);fastFood.printFastFood();}}

六、截图示例

在这里插入图片描述

相关文章:

【设计模式】装饰者模式

目录 一、定义二、结构三、优点四、使用场景五、代码示例六、截图示例 一、定义 1.在不改变现有对象结构的情况下,动态给该对象添加额外功能的模式 2.类B继承于类A,并将类A作为B类的属性(B类聚合A类) 3.BufferedInputStream、Buff…...

open cv快速入门系列---数字图像基础

目录 一、数字图像基础 1.1 数字图像和图像单位 1.2 区分图片分辨率与屏幕分辨率 1.3 图像的灰度与灰度级 1.4 图像的深度 1.5 二值图像、灰度图像与彩色图像 1.6 通道数 二、数字图像处理 2.1 图像噪声及其消除 2.2 数字图像处理技术 2.2.1 图像变换 2.2.2 图像增强…...

基础知识回顾:借助 SSL/TLS 和 NGINX 进行 Web 流量加密

原文作者: Robert Haynes 原文链接: 基础知识回顾:借助 SSL/TLS 和 NGINX 进行 Web 流量加密 NGINX 唯一中文官方社区 ,尽在 nginx.org.cn 网络攻击者肆无忌惮、作恶多端,几乎每天都有网络入侵、数据窃取或勒索软件攻击…...

iPhone 14 Plus与iPhone 14 Pro:你应该买哪一款

又到了iPhone季,这意味着你可能会在几种不同的机型之间左右为难,无法决定买哪一款。更令人困惑的是,苹果推出的iPhone变体——iPhone 14 Plus,只比老款iPhone 14 Pro低100美元。 有这么多选择,你可能想知道哪款iPhone最适合你。你应该买一部大屏幕的iPhone 14 Plus并节省…...

操作系统清华同步笔记:定义概述+计算机内存和硬盘布局+启动流程顺序+中断、异常和系统调用

定义概述 从用户角度来看,操作系统是一个控制软件,用以管理应用程序,为应用程序提供服务,杀死应用程序等。从内部文件角度来看,操作系统是一个资源管理器,用以管理外设,分配资源。层次结构&…...

uniapp 配置并使用 VueX

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 uni-app 内置了 VueX 1、创建需要的文件 右键点击 根目录【我的是 uni-shop】,然后新建 目录&a…...

vue v-on 艾特@

vue v-on 内联代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…...

【Ajax】发送跨域的POST请求时,浏览器会先发送一次OPTIONS请求,然后才发送原本的POST请求

当发送跨域的POST请求时&#xff0c;浏览器会先发送一次OPTIONS请求&#xff0c;这是因为浏览器的同源策略。OPTIONS请求被称为预检请求(pre-flight request)&#xff0c;它是CORS(跨源资源共享)机制中的一部分。 预检请求的目的是为了确保实际请求&#xff08;例如POST、PUT等…...

np.numpy, np.reshape, np.cumsum方法速查

1 np.numpy() 创建一个数组 state[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]] state2np.array(state) print(state) print(state2)[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]] [[ 1 2 3 4 5] [ 6 7 8 9 10] [11 12 13 14 15]] 2 np.reshape() 常用于矩阵规…...

七、Kafka-Kraft 模式

目录 7.1 Kafka-Kraft 架构7.2 Kafka-Kraft 集群部署 7.1 Kafka-Kraft 架构 左图为 Kafka 现有架构&#xff0c;元数据在 zookeeper 中&#xff0c;运行时动态选举 controller&#xff0c;由controller 进行 Kafka 集群管理 右图为 kraft 模式架构&#xff08;实验性&#xff…...

jvm开启远程调试功能;idea远程debug

概述 有时候一些问题本地调试无法复现&#xff0c;这个时候可以开启jvm的远程调试功能 jar包启动 jdk8 java -agentlib:jdwptransportdt_socket,address8787,servery,suspendn -jar xxx.jarjdk11/17 java -agentlib:jdwptransportdt_socket,address*:8787,servery,suspe…...

视频汇聚/视频云存储/视频监控管理平台EasyCVR视频平台添加萤火云设备的具体操作步骤

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...

vue 加载图片不显示

解决vue加载图片不显示问题 加载图片前边加上require require通常用于引入静态资源&#xff0c;如图片、样式文件等。 navList: [{ title: "大盘行情", imgSrc: require ("../../public../../public/imgs/nav1.png") , linkto: "" },{ title: &q…...

Java for循环每次都通过list.size()和 string.length()获取大小性能

有人说在for循环之前用一个局部变量先获取到list.size()、str.length()&#xff0c;然后在for循环的判断条件里通过这个局部变量替换list.size()、str.length()会节省数据计算的时间。事实真的是这样吗&#xff1f;下面就为大家解答这个问题。 说明&#xff1a;此文章针对Andro…...

面试题 08.01. 三步问题

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;面试题 08.01. 三步问题 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 动态规划。1 阶楼梯 1 种走法&#xff0c;2 阶楼梯 2 种走法&#xff0c;3 阶楼梯 6 种类走法。假设有 n(n>3) 阶…...

springboot添加SSL证书,支持https与http

文章目录 一、添加ssl证书二、配置文件三、配置同时支持HTTPS与HTTP四、启动 一、添加ssl证书 将证书文件放在/resource目录下 二、配置文件 修改配置文件 server:ssl:# 指定保存SSL证书的秘钥存储的路径key-store: classpath:dev.cobona.cn.pfx# 访问秘钥存储的密码key-store-…...

【AI】《动手学-深度学习-PyTorch版》笔记(二十):图像增强、微调

AI学习目录汇总 1、图像增强 图像增强可以扩展训练样本数量、减小对某个属性的依赖。比如,裁剪图像,可以减少模型对对象出现位置的依赖;调整亮度、颜色等因素来降低模型对颜色的敏感度等 1.1、准备工作 头文件 %matplotlib inline:图表直接嵌入到Notebook中,本人使用的…...

Vulnhub: Ragnar Lothbrok: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.226 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.226 作者提示修改hosts文件 目录爆破 gobuster dir -u http://armbjorn -w /usr/share/wordlists/dirbuster/directory-l…...

Ubuntu 20.04 Server配置网络

0&#xff0c;环境 服务器&#xff1a; Intel(R) Xeon(R) Gold 6248R CPU 3.00GHz 96核 网卡&#xff1a; 多网卡 1&#xff0c; 镜像下载 http://old-releases.ubuntu.com/releases/ubuntu-20.04.1-desktop-amd64.iso 2&#xff0c; 系统安装--具体步骤就不贴出来&#…...

jmeter 线程组

在jmeter中&#xff0c;通过指定并发数量、启动延迟时间和持续时间&#xff0c;并组织示例&#xff08;Samplers&#xff09;在多个线程之间的执行方式&#xff0c;实现模拟并发用户的行为。 添加线程组&#xff1a; 在测试计划中&#xff0c;右键点击“添加” -> “Thread…...

FastAdmin旧版本CVE-2024-7928任意文件读取漏洞实战修复指南

1. 这个漏洞不是“能读任意文件”那么简单&#xff0c;而是整个权限体系的崩塌起点FastAdmin 是国内 PHP 后台开发领域使用率极高的开源框架&#xff0c;尤其在中小型企业定制化管理后台、政企内部系统、电商中台等场景中&#xff0c;大量项目仍基于 v1.3.x ~ v1.4.5 版本运行。…...

Midjourney V6皮肤渲染实战手册:从油腻/塑料/失真到真实毛孔级质感的5步黄金流程

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney V6皮肤渲染的核心挑战与认知跃迁 Midjourney V6 在图像生成能力上实现了质的飞跃&#xff0c;尤其在材质表现维度——皮肤渲染——呈现出前所未有的真实感与层次感。然而&#xff0c;这种进…...

从拉灯呼叫到闭环处理:安灯管理软件操作流程能解决哪些场景痛点?一套安灯管理软件操作流程实战

在制造工厂的生产现场&#xff0c;异常就像不速之客&#xff0c;总在最忙的时候敲门。设备突然停机、物料没送到位、质量出现批量不良……这些异常发生后&#xff0c;最让人头疼的往往不是问题本身&#xff0c;而是处理问题的过程。工人发现设备停了&#xff0c;扯着嗓子喊班长…...

卡梅德生物技术快报|噬菌体随机肽库筛选实战:花生过敏原 Ara h 5 模拟表位鉴定全流程

摘要本文面向生物研发、体外诊断、蛋白质工程开发者&#xff0c;系统讲解噬菌体随机肽库筛选过敏原模拟表位完整工程化流程&#xff1a;从问题分析、实验设计、关键参数到结果验证&#xff0c;提供可复现技术方案&#xff0c;基于真实研究数据&#xff0c;聚焦高可靠性表位筛选…...

双十一话务峰值8倍冲击_智能语音机器人扛峰技术方案

双十一话务峰值8倍冲击&#xff1a;国内主流的智能语音机器人推荐这样扛本文从技术架构视角&#xff0c;解析智能语音机器人在电商大促场景下应对话务峰值冲击的核心方案。一、电商大促场景下的客服联络核心挑战 每年双十一、618 等大促节点&#xff0c;电商零售行业的话务量都…...

揭秘Midjourney V6蒸汽波出图失败率高达63%的底层原因:3步绕过平台封禁,稳定生成霓虹故障美学

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;蒸汽波美学的数字幽灵&#xff1a;Midjourney V6封禁机制本质解构 蒸汽波&#xff08;Vaporwave&#xff09;以低保真采样、CRT扫描线、80年代商业图腾与数字怀旧为视觉语法&#xff0c;其美学内核恰恰在于对…...

8.C# —— 随机数、DateTime时间、字符串

一、C# 随机数&#xff08;伪随机 安全随机&#xff09;1. 核心概念计算机中没有真正的随机数&#xff0c;生成的都是伪随机数&#xff08;通过算法 种子计算得出&#xff09;。种子相同 → 生成的随机数序列完全相同不指定种子 → 默认使用系统当前时间作为种子&#xff0c;…...

3步让PS手柄在Windows上完美运行:DS4Windows终极配置指南

3步让PS手柄在Windows上完美运行&#xff1a;DS4Windows终极配置指南 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否曾为心爱的PlayStation手柄在Windows电脑上无法被游戏识别而烦…...

别再乱加“impressionism”!Midjourney印象派风格生效的3个前置条件,90%新手忽略第2条

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;印象派风格在Midjourney中的本质误读与认知纠偏 当用户在 Midjourney 中输入 --style raw --s 750 并附加诸如 “impressionist painting” 或 “Monet style” 等提示词时&#xff0c;模型实际响应的并非印…...

Python初学者项目练习23--计算圆的面积

一、练习题目 定义一个函数&#xff0c;这个函数用于计算并返回给定半径的圆的面积&#xff08;要求结果保留两位小数&#xff09; 二、代码 1.初始版本 代码如下&#xff1a; def area(r):"""作用&#xff1a;用于计算并返回给定半径的圆的面积&#xff08;要求…...