Spring 设计模式之装饰器模式

Spring 设计模式之装饰器模式

装饰器模式

装饰器模式允许我们在不修改原始类(即被装饰对象)的情况下,动态地向对象添加新的行为或修改现有行为。

用到的场景

存在一个原始类,在不改动原始类的基础上,新建一个类来继承原始类里面的方法或者改动这些方法,亦可增加独属于自己的方法。

简单来说就是以原始类为原型进行扩展

需要存在的核心类:

1.原始类

2.装饰器基类(抽象)

3.具体的装饰类

具体的java例子:

java 复制代码
// 假设 Coffee 是一个接口,定义了咖啡的基本属性和方法  
public interface Coffee {
    String getDescription();
    double getCost();
}

// 原始类;基本的咖啡实现  
class BasicCoffee implements Coffee {
    @Override
    public String getDescription() {
        return "基础咖啡";
    }

    @Override
    public double getCost() {
        return 2.0;
    }
}

// 装饰器基类,持有对另一个 Coffee 对象的引用  
abstract class Decorator implements Coffee {
    protected Coffee coffee;

    public Decorator(Coffee coffee) {
        this.coffee = coffee;
    }

    @Override
    public String getDescription() {
        return coffee.getDescription();
    }

    @Override
    public double getCost() {
        return coffee.getCost();
    }
}

// 具体的装饰器,添加牛奶  
class MilkDecorator extends Decorator {
    public MilkDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String getDescription() {
        return coffee.getDescription() + ",加牛奶";
    }

    @Override
    public double getCost() {
        return coffee.getCost() + 0.5; // 假设加牛奶要额外0.5美元  
    }
}

// 具体的装饰器,改描述、改价格
class GzDecorator extends Decorator {
    public GzDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String getDescription() {
        return "换描述了:GzDecorator";
    }

    @Override
    public double getCost() {
        return 100; //
    }
}


// 具体的装饰器,改描述、改价格
class TjDecorator extends Decorator {
    public TjDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String getDescription() {
        return "换描述了:TjDecorator";
    }

    @Override
    public double getCost() {
        return 100; //
    }

    public String addSomethingSpecial() {
        return "我自己加的新方法哦...";
    }
}


// 使用示例  
class Main {
    public static void main(String[] args) {
        // 创建一个基础咖啡对象  
        Coffee coffee = new BasicCoffee();  
        System.out.println("装饰前: " + coffee.getDescription() + " - $" + coffee.getCost());  
  
        // 第一个装饰器:加牛奶  
        coffee = new MilkDecorator(coffee);  
        System.out.println("加牛奶后: " + coffee.getDescription() + " - $" + coffee.getCost());  
  
        // 第二个装饰器:GzDecorator(换描述、换价格)  
        coffee = new GzDecorator(coffee);  
        System.out.println("GzDecorator装饰后: " + coffee.getDescription() + " - $" + coffee.getCost());  
  
        // 注意:这里我们不再将TjDecorator直接创建为TjDecorator coffee1,而是也作为coffee的一个装饰器  
        // 第三个装饰器:TjDecorator(换描述、换价格,并添加新方法)  
        coffee = new TjDecorator(coffee);  
        System.out.println("TjDecorator装饰后: " + coffee.getDescription() + " - $" + coffee.getCost()  
                + " " + ((TjDecorator) coffee).addSomethingSpecial()); // 需要强制类型转换来调用addSomethingSpecial()  
  
    }
}

输出结果

javascript 复制代码
装饰前: 基础咖啡 - $2.0
装饰后: 基础咖啡,加牛奶 - $2.5
装饰后: 换描述了:GzDecorator - $100.0
装饰后: 换描述了:TjDecorator - $100.0 我自己加的新方法哦...
相关推荐
葬送的代码人生11 小时前
别再让 AI 瞎写代码了!Vibe Coding 三步法教你写出靠谱代码
前端·设计模式·架构
gaolei_eit12 小时前
Java+Ai+vue
java·spring·maven
玉&心12 小时前
关于配置mcp服务端sse-message-endpoint和sse-endpoint的注意点
spring·springai·mcp
蚰蜒螟13 小时前
一次 Spring AOP 与定时任务引发的死锁排查实录
java·spring·firefox
Java爱好狂.14 小时前
Java就业需要学习哪些内容?
spring·程序员·springboot·架构师·java面试·java面试题·java八股文
无风听海15 小时前
Claude Agent Skills 的四种设计模式;从渐进式披露到最小权限
java·算法·设计模式
listening77715 小时前
HarmonyOS 6.1 元服务深度优化:从“秒开”到“常驻”的极致体验
java·开发语言·spring
富贵冼中求16 小时前
从单向流到双向 RPC:Agent 通信协议的范式分叉与 ACP 协议实战拆解
设计模式·架构
电子科技圈19 小时前
先进封装、芯粒架构和3D集成——先进异构集成亟需兼具标准化与定制化能力的互联及总线IP解决方案
tcp/ip·设计模式·架构·软件构建·代码规范·设计规范