java设计模式之装饰者模式

本文通过一个具体案例介绍了装饰者模式的概念及其应用。装饰者模式允许在不改变对象结构的前提下动态扩展其功能,提供了一种比继承更为灵活的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰者模式介绍

文章参考码农翻身的例子进行解释。
装饰者模式又名包装(Wrapper)模式。装饰者模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

装饰者模式动态地将责任附加到对象身上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

没有应用场景这样说是可能没什么感觉。

这里我们假设我们的项目按照业务分模块,假定我们有用户管理模块、订单管理模块、支付管理模块,这几个业务模块都需要日志模块输出日志,安全模块进行加密,事物模块、性能统计模块

这些通用性的非功能性需求是几个业务模块都需要的,跨模块的。如图
在这里插入图片描述
拿我们的订单模块来说,他的代码实现有可能会这样

public class PlaceOrderCommand {
    /**
     * chuli
     */
    public void execute() {
        //日志处理
        Logger logger = new Logger();
        logger.log();
        //性能统计
        Perforamce perforamce = new Perforamce();
        perforamce.doing();
        benginTransition();
        //TODO:进行订单业务处理

        endTransition();
    }
    }

然后我们其他模块也需要这么做,就会发现代码重复太多了。此时我们会想到抽象出来共有的,让各种具体的业务类去实现具体的业务

public abstract class BaseCommond {
    public void execute() {
        //日志处理
        Logger logger = new Logger();
        logger.log();
        //性能统计
        Perforamce perforamce = new Perforamce();
        perforamce.doing();
        benginTransition();
        doingBussiness();
        endTransition();
    }

    abstract void doingBussiness();

如上doingBussiness();就是具体的业务,哪个业务去继承,就在此作方法做具体的业务。
但此方法有个巨大的缺点:父类定义了一切,要执行那些代码,以什么顺序执行等等都被固定,无法更改。

此时我们的装饰者模式便可以派上用场了

public interface Command {
    public void excute();
}

记录日志装饰器
public class LoggerDecorator implements Command {
    Command mCommand;
    public LoggerDecorator(Command command) {
        mCommand = command;
    }
    @Override
    public void excute() {
        //TODO:做这个装饰要做的事情
        Logger logger=Logger.getLogger("my");
        Log.d("mytag","LoggerDecorator");
         mCommand.excute();

    }
}

性能统计装饰器
public class PerformanceDecorator implements Command {
    Command mCommand;
    public PerformanceDecorator(Command command) {
        mCommand = command;
    }
    @Override
    public void excute() {
        //TODO:做这个装饰要做的事情
        Log.d("mytag","PerformanceDecorator");
        mCommand.excute();
    }
}

具体的业务
public class PlaceOrderCommant  implements Command {
    @Override
    public void excute() {
        //TODO:做这个装饰要做的事情
    }
}

现在我们让这个业务能够打印日志、性能统计
LoggerDecorator loggerDecorator = new LoggerDecorator(
new PerformanceDecorator(new PlaceOrderCommand()));
loggerDecorator.excute();
这样就可以使用任意数量的装饰器,任意次序执行。

内容概要:本文深入探讨了软件项目配置管理在汽车开发领域的应用及其重要性,强调配置管理不仅是版本控制,更是涵盖标识、追溯、结构化等多方面的深度管控。文章通过对比机械产品和软件产品的标签管理,揭示了软件配置管理的独特挑战。配置管理构建了一个“网”状体系,确保软件产品在复杂多变的开发环境中保持稳定和有序。文中还讨论了配置管理在实际工作中的困境,如命名混乱、文档更新不及时、发布流程冗长等问题,并提出了通过结构可视化、信息同源化、痕迹自动化和基线灵活化等手段优化配置管理的具体方法。 适合人群:具备一定软件开发和项目管理经验的工程师及项目经理,尤其是从事汽车电子软件开发的相关人员。 使用场景及目标:①理解配置管理在汽车软件项目中的核心作用;②学习如何通过工具链(如Polarion、JIRA、飞书等)优化配置管理流程;③掌握结构可视化、信息同源化、痕迹自动化和基线灵活化等关键技术手段,提升项目管理水平。 其他说明:配置管理不仅是技术问题,更涉及到项目管理和团队协作。文中强调了工具链的应用和优化的重要性,但同时也指出,工具本身并不能解决所有问题,关键在于如何合理使用工具并不断优化管理流程。文章呼吁读者成为长期主义者,相信时间的力量,持续改进配置管理工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值