(8)设计模式之装饰模式(结构型模式)

java 中的设计模式 通常,一个设计模式描述了一个被证明可行的方案。这些方案非常广泛,是具有完整定义的最常用的行式。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。 阅读详情

声明:以下都是博主浅薄的经验之谈,欢迎大家学习交流

使用场景

  • 我们在做系统设计的时候,一个非常重要的工作就是把大系统进行逐一的分解在分解。譬如用户管理模块、支付模块,但是每一个模块的某些业务功能都是通用。如在执行业务方法之前需进行这个操作:记录业务方法的操作日志;统计业务方法的执行时间;业务方法开始前开启事务,方法结束之后提交事务,方法异常回滚事务。
  • 于是就会产生如下类似的伪代码
public void PayService{
    public Response execute()
    {
        logger.debug("....");//记录日志
        RecordTimeUtiles.startTime();//记录业务方法执行时间
        //执行业务方法的的代码...
        //......
        //......
        RecordTimeUtiles.endTime();
    }
}
  • 虽然这样的代码实现了功能,但是可想而知后续增加更多的业务功能方法,也都是需要重复以上的代码。

  • 此时可以应用模板方法设计模式来解决以上大部分代码重复的问题。

  • AbstractService.java
public abstract class AbstractService{
    public void execute(){
        logger.debug("....");//记录日志
        RecordTimeUtiles.startTime();//记录业务方法执行时间
        //执行业务方法的的代码...
        //......
        payServiceExecute();
        //......
        RecordTimeUtiles.endTime();

    }
    public abstract Response payServiceExecute();
}
  • PayService.java
public class PayService extends AbstractService{
    public Response payServiceExecute(){
        //执行业务方法的的代码...
        //......
        //......
    }
}
  • 此时父类AbstractService.java 已经将原先的记录日志、方法执行时间等重复性的代码都写好了,而子类PayService.java只需要通过实现父类的抽象方法【payServiceExecute】去实现自己需要的业务功能代码即可!
    调用的方式很简单如下:
    AbstractService as = new PayService();
    as.execute();
  • 缺点:这样的方式最大的缺陷就是父类定义了一切,子类要毫无保留的去服从。什么执行顺序啥的,都不是子类所能控制的,假如某个子类不要统计方法的时间只要记录日志,此时这样的设计方法就无能为力了。

装饰模式

  • 如果利用装饰模式,针对上面问题将会带来更大的灵活性,且看!

  • Service.java

    public interface Service{
        Response execute();
    }
  • LogDecorator.java
public class LogDecorator implements Service{
private Service service;
public LogDecorator (Service service){
        this.service = service;
    }
    public Response execute(){
        logger.debug("....");//记录日志
        this.service.execute();
    }
}
  • RecordTimeDecorator.java
public class RecordTimeDecorator implements Service{
private Service service;
public RecordTimeDecorator(Service service){
        this.service = service;
    }
    public Response execute(){
      RecordTimeUtiles.startTime();//记录业务方法执行时间
        this.service.execute();
      RecordTimeUtiles.endTime();
    }
}
  • PayService.java
public class PayService implements Service{
    public Response execute(){
        //执行业务方法的的代码...
        //......
    }
}
  • 调用方式
//场景一:只需要记录日志
Service service = new LogDecorator(new PayService());
service.execute();
//场景二:只需要记录业务方法执行的时间
Service  service = new RecordTimeDecorator(new PayService());
service.execute();
//场景三:需要记录日志;记录业务方法执行的时间
Service  service = new RecordTimeDecorator(new LogDecorator(new PayService()));
service.execute();
  • 是不是很灵活,我们要什么就包装什么。而且还可能指定包装的顺序从而实现代码执行的顺序。

声明:以上都是博主浅薄的经验之谈,欢迎大家学习交流

PCIe控制器深度解析-RK3588 PCIe子系统核心模块探秘 本文深度解析了RK3588芯片中PCIe子系统的核心架构与功能模块。文章将PCIe控制器比作智能交通枢纽,详细阐述了RADM、XADM、CDM、eDMA等核心模块的工作原理,包括数据流管理、地址转换、DMA加速及电源管理。旨在帮助开发者和硬件工程师深入理解RK3588 PCIe控制器的内部机制,为驱动开发、性能优化和故障排查提供清晰的思路与实用指导。 阅读详情

相关推荐

VMD-CNN-BiLSTM-Attention预测模型 —— 数学模型介绍&完整实例代码

想解决电力负荷预测中的非线性、非平稳难题?这篇博客介绍了一种创新混合模型,结合变分模态分解(VMD)和CNN-BiLSTM-Attention深度学习架构,实现超高精度预测! ✨ 核心亮点: ✅ VMD分解:有效分离复杂负荷信号,提取关键频率特征 ✅ 混合深度学习:CNN捕捉局部模式 + BiLSTM学习长时序依赖 + 注意力机制聚焦关键时段 ✅ 端到端优化:从数据预处理(滑动窗口、归一化)到模型训练(MSE损失+Adam优化),完整流程公开! ✅ 工业级评估:提供MSE、MAE、MAPE、R²多指标验证

qq_42924330的博客 1653

java.util.TimeZone简介

java.util.TimeZone简介 java.util.TimeZone类的实例包含了一个与格林威治标准时间(GMT)相比较得出的以微秒为单位的时区偏移量,而且它还处理夏令时。要获得一个所有支持的进区的列表,你可以使用方法TimeZone.getAvailableIDs,它将返回一个包含了所有进区ID的字符串数组。要知道关于TimeZone类的更多细节,可以参看Sun公司的

zwq1457的专栏 2万+

达梦数据库连接报错6001网络通信异常

本文主要记录客户端连接达梦数据库报错6001网络通信异常问题分析过程、问题原因以及问题解决方法。

chen_zizi2025的博客 2772

时间处理工具类TimeUtil

转自:https://cnblogs.com/ityouknow/p/5662753.html 功能 Date与String之间的互相转换,以及一些特殊格式的时间字符串处理 代码   1 /** 2 * 类名:TimeUtil.java 类描述:时间处理工具 3 * 4 * @author wader 创建时间:2011-12-02 11:03 5 */ 6 pu...

weixin_33714884的博客 240

国产HDMI2.0芯片GSV2011怎么选?手把手教你用它设计音视频采集卡(附FPGA/海思对接指南)

本文详细解析国产HDMI2.0芯片GSV2011在音视频采集卡设计中的应用,涵盖芯片选型、硬件设计要点及与FPGA/海思平台的对接指南。GSV2011凭借4K@60Hz支持、音频提取嵌入功能和高集成度,成为音视频设备的核心选择,助力开发者快速实现高性能采集卡设计。

weixin_30181209的博客 332

python cartopy绘制扇形区域图/cartopy绘制北极部分区域

实际上,这个问题原因还是由于投影转换的问题,在set_extend时,绘制的上下边界仍然是方形、未被正确投影的边界,与我们的set_boundary存在冲突,最根本的原因还是在于cartopy对于投影计算的一些缺陷。另外我们需要指出的是:**该方法不适用于极地投影,即NorthPolarStereo,由于NorthPolarStereo本身投影特性只需一个参数,本身并不适合。我们绘制极地投影时,同样也是使用set_boundary绘制圆形边界,那么当我们想要绘制扇形时,可以通过。请根据喜好自行选择,

weixin_43750300的博客 3212

Android 常用代码整理:时间工具类(TimeUtil)

说明:大部分内容都是参考别的文章,这里做整理是为了以后的编程有实用的模板,可以即需即用。

zeqiao的博客 1064

TMC5160电机驱动芯片实战:从模式选择到参数配置全解析

本文深入解析TMC5160电机驱动芯片的实战应用,涵盖三种核心工作模式的选择策略与参数配置。详细介绍了全功能运动控制、外部脉冲驱动及独立驱动模式的应用场景与配置要点,并提供了电流控制、静音优化、SPI通信及高级功能(如StallGuard2)的调优指南,帮助开发者充分发挥其高精度、低噪音性能。

weixin_29179311的博客 323

设计模式之装饰模式(结构型)

一、模式定义 装饰模式:装饰模式就是允许向一个现有的对象添加新的功能,同时又不改变其结构,装饰模式是一种对象结构型设计模式。 二、模式角色 对于装饰模式可以分为如下角色 Component:抽象构件 ConcreteComponent:具体构件 Decorator:抽象装饰类 ConcreteDecorator:具体装饰类 三、模式分析 对于装饰模式进行解释,更易于理解。要给一个类或对象新增行...

Nicky's blog 3001

基于容积卡尔曼滤波的弹目相对姿态估计算法及其在导弹末端制导中的应用

本文针对导弹末端制导中的强非线性姿态估计问题,提出了一种基于容积卡尔曼滤波(CKF)的弹目相对姿态估计算法。通过建立包含视线角、角速率和相对距离的6维状态模型,利用三阶球面-相径容积准则精确逼近非线性状态分布,避免了传统EKF的线性化误差。在MATLAB/Simulink仿真中,CKF表现出比EKF更高的视线角速率估计精度和更快的收敛速度,最终显著减小了脱靶量,验证了其在提升导弹末端制导精度方面的有效性。该算法计算复杂度适中,适合工程实现,为高精度非线性姿态估计提供了新思路。

AI的内部世界的博客 105

Week 9 10 Neural Networks

Week 9 10 Neural Networks

金州饿霸吃不饱的博客 404

【C#设计模式】8.装饰模式(Decorator Pattern)【结构型】

1.1 动机(Motivate) 在房子装修的过程中,各种功能可以相互组合,来增加房子的功用。类似的,如果我们在软件系统中,要给某个类型或者对象增加功能,如果使用“继承”的方案来写代码,就会出现子类暴涨的情况。比如:IMarbleStyle是大理石风格的一个功能,IKeepWarm是保温的一个接口定义,IHouseSecurity是房子安全的一个接口,就三个接口来说,House是我们房子,我们的房子要什么功能就实现什么接口,如果房子要的是复合功能,接口不同的组合就有不同的结果,这样就导致我们子类膨胀严重,.

星Yeah 的博客 2895

【即插即用模块】注意力篇 | MICCAI 2023 | MFE:多尺度特征提取,告别固定感受野,猛涨2个点!

本文提出一种用于低分辨率乳腺癌病理图像超分辨率与分类的网络SHISRCNet。针对现有方法处理低分辨率图像效果差、感受野固定等问题,设计了多特征提取模块(MFE),通过多速率空洞卷积覆盖全尺度感受野(局部到全局),结合递进残差连接和动态权重融合机制,实现自适应多尺度特征增强。实验表明,该模块在超分辨率任务中PSNR提升近2个点,分类准确率显著提高。代码提供详细注释,支持即插即用,适用于各类多尺度视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 206

8、设计模式(结构型)之装饰模式

作用 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活 何时使用 在不想增加很多子类的情况下扩展类 优点 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能 实例 结构图 /** * @Author: create_By: chenxin * @Data:Created in 2018/8...

为什么坚持,想一想当初 187

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

设计模式8--Decorator模式(装饰模式)---结构型模式

在 OO 设计和开发过程,可能会经常遇到以下的情况:我们需要为一个已经定义好的类添加新的职责(操作),通常的情况我们会给定义一个新类继承自定义好的类,这样会带来一个问题(将在本模式的讨论中给出)。通过继承的方式解决这样的情况还带来了系统的复杂性,因为继承的深度会变得很深。 而 Decorator 提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合。有关这...

徐小小小hi的博客 189

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【设计模式】—-(8)装饰模式(结构型)

意图:动态的将责任附加到对象上 什么时候使用: 1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责 2.处理那些可以撤销的职责 3.当不能采用生成子类的方式进行扩充时 结构图: 示例代码: 1 package com.test.patten.decorator; 2 3 public interface Person { 4 void doC

你只管努力, 395

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

结构型设计模式之装饰模式

装饰模式是一种动态扩展对象功能的结构型设计模式,通过组合而非继承的方式在不改变原结构的前提下添加新功能。该模式包含抽象组件、具体组件、抽象装饰器和具体装饰器四个核心角色,通过层层包装实现功能叠加。相比继承,装饰模式具有更高的灵活性,避免了类爆炸问题,但会增加系统复杂度。典型应用场景包括饮料加调料、文本格式化等需要动态扩展功能的系统。C#示例展示了咖啡店订单系统和文本格式化器的实现,通过装饰器组合实现功能扩展,符合开闭原则。

冰茶的博客 1475

设计模式(11)结构型模式 - 装饰模式

前言 前面学习了结构型模式的适配器模式、桥接模式 适配器模式是将类转换成客户需要的类 桥接模式是将抽象部分和实现部分分离,使两个维度的变化分割、组合在一起 而接下来学习结构型模式 - 装饰模式 目录 现实问题 装饰模式 装饰模式结构 一个装饰模式案例 装饰模式的优缺点 使用场景 6.1. 常用的装饰模式应用 模式扩展 7.1. 具体构件扩展 7.2. 模式简化 7.3. 透明装饰模式 总结 ...

key_768的博客 598

掌握设计模式--装饰模式

装饰模式强调的是扩展对象的功能及扩展功能的组合。比如,对象A,需要扩展X、Y的功能,这些扩展功能按不同的顺序组合可以实现不同的效果,先执行X再执行Y扩展功能或者先执行Y再执行X扩展功能。看后面的例子就很好理解了。// 添加安全提供者(SM2,SM3,SM4等加密算法,CBC、CFB等加密模式,PKCS7Padding等填充方式,不在Java标准库中,由BouncyCastleProvider实现)System.out.println("--base64解密前的数据:" + readData);

weixin_55010563的博客 993

设计模式之装饰模式

摘要:装饰模式是一种结构型设计模式,通过动态包装对象来扩展功能,避免类爆炸问题。Java I/O库中的BufferedInputStream和DataInputStream就是典型应用,通过组合方式增强原始流功能。该模式遵循开闭原则,但多层装饰可能影响性能。与代理模式的区别在于:装饰模式侧重功能增强,代理模式侧重访问控制。

IT从业者 1063

设计模式学习笔记三:结构型模式(Structural Pattern)

声明:学习内容均来自《设计模式的艺术》这本书。

itman1010的博客 1658

设计模式——装饰模式(结构型)

装饰模式 (1)模式动机   装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。 (2)模式定义   装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰...

小张的记录 306

结构型模式-装饰模式

装饰模式属于结构型设计模式,通过动态地将责任附加到对象上,在不修改原有类代码的前提下扩展对象功能。该模式定义装饰器与组件实现相同接口,通过包装组件对象实现功能叠加,支持多层嵌套装饰。其核心是用组合替代继承,避免子类爆炸问题。适用于需要灵活扩展对象功能、或功能组合变化频繁的场景,可保持代码简洁性,提升系统扩展性,让功能添加更具弹性且符合开闭原则。

y245166349的专栏 1912

结构型设计模式(七种)

3. 结构型设计模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合组合对象。 由于组合关系或聚合关系比较继承关系耦合度低,满足“合成复合原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: 1)代理(Proxy)模式:为某对象提供一种代理以控制对象的访问。即客户端通过代理简介地访问该对象,从而限制、增强或修改该对象的一些特征。 2)适配器(Adapter)模式:将一个类的接口转

夏天 5485

设计模式之结构型模式

一般具有相同内部状态的享元对象存储在享元池中,通常由一个享元工厂(工厂模式)来维护,享元模式的核心就在于这个享元工厂类,当用户需要对象时,先在享元池中找,如果没有则创建新对象并加入享元池。外观模式中,外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面。具体实现类(ConcreteImplementor)实现了实现类接口并且具体实现它,在不同的具体实现类中提供基本操作的不同实现,在程序运行时,具体实现类对象将替换其父类对象,提供给客户端具体的业务操作方法。

欢迎订阅 -- 小源笔迹 860

技术成神之路:设计模式(二十)装饰模式

介绍装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变对象自身的情况下,动态地为对象添加额外的职责。这个模式通常用于增强或改变对象的功能。1.定义装饰模式通过创建一个装饰类,将功能动态地添加到被装饰类的实例中。装饰类与被装饰类实现相同的接口或继承相同的父类,这样装饰对象就可以取代被装饰对象。...

qq_35485206的博客 1039
上一篇: (7)设计模式之代理模式(结构型模式)-静态代理
下一篇: nexus私服的使用+项目的发布
yi博说
博客等级 码龄11年 20粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值