设计模式再探——装饰模式
目录
- 一、背景介绍
- 二、思路&方案
- 三、过程
- 1.装饰模式简介
- 2.装饰模式的类图
- 3.装饰模式代码
- 4.装饰模式,职责父类拆分的奥义
- 5.装饰模式,部件抽象类的无中生有
- 四、总结
- 五、升华
一、背景介绍
最近公司在做架构模型的时候,涉及到装饰模式的研究,对于装饰模式的边界理解,本次有了看山还是山的效果,故做此总结以记录本次的升华。
二、思路&方案
- 1.装饰模式简介
- 2.装饰模式的类图
- 3.装饰模式代码
- 4.装饰模式,职责父类拆分的奥义
- 5.装饰模式,部件抽象类的无中生有
三、过程
1.装饰模式简介
装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
解释:给(ConcreteComponent)对象增加一些额外(Decorator的子类)职责;就给(ConcreteComponent)增加功能来说;通过生成(ConcreteComponent)子类的方式增加功能;装饰模式更为灵活(扩展装饰子类通过聚合方式装饰,耦合性更低)
2.装饰模式的类图

3.装饰模式代码
package com.a7DesignPattern.a2StructuralType.a04Decorator;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 14:43*/
public class Client {public static void main(String[] args) {ConcreteComponent c = new ConcreteComponent();ConcreteComponentA a = new ConcreteComponentA();ConcreteComponentB b = new ConcreteComponentB();a.setComponent(c);b.setComponent(a);b.Operation();}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 11:30*/
public abstract class Component {public abstract void Operation();
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 11:37*/
public class ConcreteComponent extends Component{@Overridepublic void Operation() {System.out.println("具体对象的操作");}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 11:43*/
public class Decorator extends Component{protected Component component;@Overridepublic void Operation() {if(component != null){component.Operation();}}public void setComponent(Component component) {this.component = component;}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 14:27*/
public class ConcreteComponentA extends Decorator{private String addedState;@Overridepublic void Operation() {super.Operation();addedState = "New State";System.out.println("具体装饰对象A");}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;import com.a6UMLRelationShip.a3combination.a2.A;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 14:29*/
public class ConcreteComponentB extends Decorator{@Overridepublic void Operation() {super.Operation();AddedBehavior();System.out.println("具体装饰对象B");}private void AddedBehavior(){}
}
4.装饰模式,职责父类拆分的奥义
Decorator类是从ConcreteComponent中的装饰行为中抽象出来的类;从而使得后续扩展装饰符合开闭原则。
5.装饰模式,部件抽象类的无中生有
ConcreteComponent中的装饰行为的拆分,使得这些行为与被装饰者必须得从客户端产生关系;这也就对客户端暴露了业务;因而产生Component类。
四、总结
- 1.无装饰模式情况下,将装饰方式当做被装饰者类中行为;这些行为对于被装饰者类而言不支持开闭原则。
- 2.装饰行为在被装饰者中剥离之后,使得两个如何合并成为了眼前的问题。
- 3.无中生有的做一个部件抽象类,又将两者做了部件类上的合并。
- 4.技术上可以实现,业务上没有实现;这样的一种实现结果是否算是符合要求的? 将这条透明化的问题提出来也是进步的印证。
五、升华
该模式从技术角度通过剥离+无中生有父类的角度实现了扩展装饰符合开闭原则,并且对于客户端也没有对外暴露装饰过程的效果;在业务的角度是需要站到技术的基础之上去理解业务才会更加顺畅。
相关文章:
设计模式再探——装饰模式
目录 一、背景介绍二、思路&方案三、过程1.装饰模式简介2.装饰模式的类图3.装饰模式代码4.装饰模式,职责父类拆分的奥义5.装饰模式,部件抽象类的无中生有 四、总结五、升华 一、背景介绍 最近公司在做架构模型的时候,涉及到装饰模式的研…...
【Python必做100题】之第一题(求两数相加)
思路:键盘输入两个数字,求出两个数的和并打印 代码如下: num1 int(input("请输入一个数字:")) num2 int(input("再输入一个数字:")) #求两数相加 result num1 num2 print(f"两数相加的…...
java面试-Dubbo和zookeeper运行原理
远离八股文,面试大白话,通俗且易懂 看完后试着用自己的话复述出来。有问题请指出,有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来,大家一起解决。 java面试题汇总-目录-持续更新中 分布式注册中心和服务调…...
Rsync+Sersync
服务器相关参数 源服务器 192.168.17.101 目标服务器(同步到的服务器) 192.168.17.103 ##目标服务器配置 ###1、配置rsync服务 1、安装rsync yum -y install rsync 2、配置rsync vim /etc/rsyncd.conf 配置文件内容 uid root gid root use c…...
Leetcode刷题笔记题解(C++):25. K 个一组翻转链表
思路:利用栈的特性,K个节点压入栈中依次弹出组成新的链表,不够K个节点则保持不变 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …...
从线性回归到神经网络
目录 一、线性回归关键思想 1、线性模型 2、基础优化算法 二、线性回归的从零开始实现 1、生成数据集 2、读取数据集 3、初始化模型参数 4、定义模型 5、定义损失函数 6、定义优化算法 7、训练 三、线性回归的简洁实现 1、生成数据集 2、读取数据集 3、定义模型…...
LANDSAT_7/02/T1/RAW的Landsat7_C2_RAW类数据集
Landsat7_C2_RAW是指Landsat 7卫星的数据集,采用的是Collection 2级别的数据处理方法,对应的是Tier 1级别的原始数据(RAW)。该数据集包括了Landsat 7卫星从1999年4月15日开始的所有数据,共涵盖了全球范围内的陆地和海洋…...
绕过360给目标机器添加账户
CS BOF是什么? Beacon 对象文件 (BOF) 是一个已编译的 C 程序,按照约定编写,允许其在 Beacon 进程内执行并使用内部 Beacon API。BOF 是一种通过新的利用后功能快速扩展 Beacon 代理的方法。 BOF 的占地面积较小。它们在 Beacon 进程内部运…...
C/C++ 题目:给定字符串s1和s2,判断s1是否是s2的子序列
判断子序列一个字符串是否是另一个字符串的子序列 解释:字符串的一个子序列是原始字符串删除一些(也可以不删除)字符,不改变剩余字符相对位置形成的新字符串。 如,"ace"是"abcde"的一个子序…...
Nginx的stream配置
一、stream模块概要。 stream模块一般用于tcp/UDP数据流的代理和负载均衡,可以通过stream模块代理转发TCP消息。 ngx_stream_core_module模块由1.9.0版提供。 默认情况下,没有构建此模块。 -必须使用-with stream配置参数启用。 也就是说,必…...
ubuntu 20.04 server 安装 zabbix
ubuntu 20.04 server 安装 zabbix 参考文档 zabbix没用过,用过prometheus, 因为现在很多应用都支持直接接入prometheus监控, 而且大部分语言都都有sdk支持, 可以直接接入自己的业务数据监控。 https://www.zabbix.com/cn/downlo…...
hive映射es表任务失败,无错误日志一直报Task Transitioned from NEW to SCHEDULED
一、背景 要利用gpt产生的存放在es种的日志表做统计分析,通过hive建es的映射表,将es的数据拉到hive里面。 在最初的时候同事写的是全量拉取,某一天突然任务报错,但是没有错误日志一直报:Task Transitioned from NEW t…...
手眼标定 - 最终精度和误差优化心得
手眼标定 - 标定误差优化项 一、TCP标定误差优化1、注意标定针摆放范围2、TCP标定时的点次态与工作姿态尽可能保持相近 二、深度相机对齐矩阵误差1、手动计算对齐矩阵 三、手眼标定拍照姿态1、TCP标定姿态优先2、水平放置棋盘格优先 为减少最终手眼标定的误差,可做或…...
pytorch一致数据增强
分割任务对 image 做(某些)transform 时,要对 label(segmentation mask)也做对应的 transform,如 Resize、RandomRotation 等。如果对 image、label 分别用 transform 处理一遍,则涉及随机操作的…...
MapReduce
1. MapReduce是什么?请简要说明它的工作原理。 MapReduce是一种编程模型,主要用于处理大规模数据集的并行运算,特别是非结构化数据。这个模型的核心思想是将大数据处理任务分解为两个主要步骤:Map和Reduce。用户只需实现map()和r…...
Spring Boot 快速入门
Spring Boot 快速入门 什么是Spring Boot Spring Boot是一个用于简化Spring应用开发的框架,它基于Spring框架,提供了自动配置、快速开发等特性,使得开发者可以更加便捷地构建独立的、生产级别的Spring应用。 开始使用Spring Boot 步骤一&a…...
什么是神经网络的非线性
大家好啊,我是董董灿。 最近在写《计算机视觉入门与调优》(右键,在新窗口中打开链接)的小册,其中一部分说到激活函数的时候,谈到了神经网络的非线性问题。 今天就一起来看看,为什么神经网络需…...
前端知识(十四)——浅谈用户体验测试的主要功能
用户体验(User Experience,简称UX)在现代软件和产品开发中变得愈发重要。为了确保产品能够满足用户期望,提高用户满意度,用户体验测试成为不可或缺的环节。本文将详细探讨用户体验测试的主要功能,以及它在产品开发过程中的重要性 …...
解决前端跨域问题,后端解决方法
Spring CloudVue前后端分离项目报错:Network Error;net::ERR_FAILED(请求跨越)-CSDN博客记录自用...
【网络奇缘系列】计算机网络|数据通信方式|数据传输方式
🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 这篇文章是关于计算机网络中数据通信的基础知识点, 从模型,术语再到数据通信方式&#…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
Qt学习及使用_第1部分_认识Qt---Qt开发基本流程
前言 学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面. 参考书:<Qt 6 C开发指南>(以下称"本书") 标识说明:概念用粗体倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字), 本书原话内容用深蓝色标识,比较重要的内容用加粗倾…...
统计按位或能得到最大值的子集数目
我们先来看题目描述: 给你一个整数数组 nums ,请你找出 nums 子集 按位或 可能得到的 最大值 ,并返回按位或能得到最大值的 不同非空子集的数目 。 如果数组 a 可以由数组 b 删除一些元素(或不删除)得到,…...
XXE漏洞知识
目录 1.XXE简介与危害 XML概念 XML与HTML的区别 1.pom.xml 主要作用 2.web.xml 3.mybatis 2.XXE概念与危害 案例:文件读取(需要Apache >5.4版本) 案例:内网探测(鸡肋) 案例:执行命…...
Tableau for mac 驱动
Tableau 驱动程序安装指南 对于希望在 Mac OS 上使用 Tableau 进行数据分析的用户来说,确保正确安装相应的驱动程序至关重要。Tableau 支持多种数据库连接方式,并提供官方文档指导如何设置这些连接。 安装适用于 Mac 的 JDBC 或 ODBC 驱动程序 为了使…...
