23种设计模式之装饰者模式(被装饰者,接口层,装饰抽象层,具体装饰者)

23种设计模式之装饰者模式

文章目录

设计思想

原文:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。把一个形状装饰上不同的颜色同时又不改变形状类

简述 :看到原文介绍,很多人会认为装饰者模式与代理模式没区别,其实区别还是有的,只是在用的时候可能会存在异变代理模式,装饰者模式其根本是为了 增强被装饰者的方法。

装饰者模式的优点

  • 可以在不修改原有对象的基础上给对象增加新的功能,遵循开闭原则。
  • 可以使用多个具体装饰者来组合出不同的功能,实现灵活性和可扩展性。
  • 可以根据需要动态地增加或删除功能,而不影响其他对象。
  • 可以保持被装饰对象的类型和接口不变,对客户端透明。

装饰者模式的缺点

-会增加系统的复杂度和类的数量,可能导致代码难以理解和维护。

  • 会增加对象之间的耦合度,可能引入循环引用的问题。
  • 会影响被装饰对象的效率和性能。
  • 动态地多层装饰时,调试和维护比较困难

装饰者模式的优化方法

  • 尽量减少装饰者的数量和层次,避免过度使用装饰者模式
  • 使用工厂方法或者建造者模式来创建装饰者对象,简化客户端的调用
  • 使用组合/聚合代替继承,降低装饰者和被装饰者之间的耦合度

UML 解析

预设场景

RanchStaff 牧场工作人员
CowRanch 奶牛牧场
MilkProcessing 牛奶加工
RanchAiRobot 牧场人工智能机器人

复制代码
牧场工作人员可以挤奶 生产牛奶 但是我想在生产牛奶前进行消毒处理以及牛奶生产后进行包装

代码释义

复制代码
/**
 * 奶牛牧场
 */
public interface CowRanch {
    void milkProduction();
}

public class MilkProcessing extends RanchAiRobot {

    public MilkProcessing(CowRanch cowRanch) {
        super(cowRanch);
    }

    public void disinfect() {
        System.out.println("先进行消毒 处理");
    }

    @Override
    public void milkProduction() {
        disinfect();
        super.milkProduction();
        packageMilk();
    }

    public void packageMilk() {
        System.out.println("将生产出的牛奶进行包装");
    }
}

/**
 * 牧场人工智能 机器人
 */
public abstract class RanchAiRobot implements CowRanch {
    private CowRanch cowRanch;

    public RanchAiRobot() {
    }

    public RanchAiRobot(CowRanch cowRanch) {
        this.cowRanch = cowRanch;
    }

    public void milkProduction() {
        cowRanch.milkProduction();
    }
}

/**
 * 牧场工作人员
 */
public class RanchStaff implements CowRanch {
    public void milkProduction() {
        System.out.println("将奶牛的奶挤出,制成牛奶");
    }
}

总结

装饰者模式 其核心就是为了增强方法,对原业务的扩展,以上面的场景来说,牧场工作人员只做牛奶的生产,但是想要对牛奶进行销售,只生产是不够的,生产前后都需要增加其他的行为。
装饰抽象层存在的意义 抽象类实现接口,可以选择性的去实现接口的抽象方法,并不需要重写接口所有方法,装饰抽象层可以精确的让具体装饰者去装饰某一个行为。

相关推荐
骇客野人1 分钟前
SpringBoot电商购物车、结算、下单、库存方案设计与落地实施步骤
java·spring boot·后端
哪 吒21 分钟前
华为OD机试 - 云服务安全策略最优选择 - 深度优先搜索DFS(Java 新系统 200分)
java·华为od·深度优先
拒绝内耗。23 分钟前
程序员学架构(一):一张图看懂 Java 后端架构:一个请求怎样从手机到数据库?
java·智能手机·架构
棣廷24 分钟前
初识Python面向对象
java·开发语言
用户31268748772028 分钟前
ThreadLocal 到底会不会内存泄漏?源码级拆解 + 线程池陷阱
java
珍珠先生32 分钟前
P11 · MySQL 驱动版本过旧:Client does not support authentication protocol
java
~木雨41 分钟前
Java 并发编程架构全景:并发层的五域设计 —— 线程模型、线程池隔离、并发安全到问题治理(全体系汇总)
java·安全·架构·线程池·并发编程·高并发架构
极小狐1 小时前
从复制粘贴到可复用组件:极狐GitLab CI/CD 组件目录实战
java·ci/cd·gitlab·devops·组件化
麻瓜code1 小时前
【Agent】Spring AI RAG 实战:本地向量库 + 云端知识库
java·人工智能·spring
小刘在重生~1 小时前
Java 集合|Collection、List、ArrayList、LinkedList、泛型、Collections 工具类
java·数据结构·list