设计模式最佳实践代码总结 - 结构型设计模式篇 - 装饰器设计模式最佳实践

目录

装饰器设计模式最佳实践

装饰器模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象动态地添加职责。这种模式可以用来扩展对象的功能,而无需修改原始类。

以下是一个使用装饰器模式的示例,我们将创建一个简单的咖啡订单系统,其中Coffee是一个接口,SimpleCoffee是一个基础实现,而CoffeeDecorator是一个装饰器基类,其他装饰器类(如MilkDecorator和SugarDecorator)可以继承自它来添加额外的功能。
<<Interface>> Component +operation() ConcreteComponent +operation() Decorator +Component component +Decorator(component: Component) +operation() ConcreteDecoratorA +operation() +addedBehavior() ConcreteDecoratorB +operation() +anotherBehavior()

1. 基础demo

首先,我们定义Coffee接口和基础实现:

java 复制代码
public interface Coffee {
    double cost();
    String description();
}

public class SimpleCoffee implements Coffee {
    @Override
    public double cost() {
        return 1.0; // 基础咖啡的价格
    }

    @Override
    public String description() {
        return "Simple Coffee";
    }
}

然后,我们创建一个装饰器基类:

java 复制代码
public abstract class CoffeeDecorator implements Coffee {
    protected Coffee decoratedCoffee;

    public CoffeeDecorator(Coffee decoratedCoffee) {
        this.decoratedCoffee = decoratedCoffee;
    }

    @Override
    public double cost() {
        return decoratedCoffee.cost();
    }

    @Override
    public String description() {
        return decoratedCoffee.description();
    }
}

接下来,我们创建具体的装饰器类来添加额外的功能:

java 复制代码
public class MilkDecorator extends CoffeeDecorator {
    public MilkDecorator(Coffee decoratedCoffee) {
        super(decoratedCoffee);
    }

    @Override
    public double cost() {
        return super.cost() + 0.5; // 牛奶的价格
    }

    @Override
    public String description() {
        return super.description() + ", Milk";
    }
}

public class SugarDecorator extends CoffeeDecorator {
    public SugarDecorator(Coffee decoratedCoffee) {
        super(decoratedCoffee);
    }

    @Override
    public double cost() {
        return super.cost() + 0.3; // 糖的价格
    }

    @Override
    public String description() {
        return super.description() + ", Sugar";
    }
}

现在,我们可以使用这些装饰器来创建复杂的咖啡订单:

java 复制代码
public class CoffeeShop {
    public static void main(String[] args) {
        Coffee myOrder = new SugarDecorator(new MilkDecorator(new SimpleCoffee()));
        System.out.println("Description: " + myOrder.description());
        System.out.println("Cost: $" + myOrder.cost());
    }
}

输出结果:

Description: Simple Coffee, Milk, Sugar

Cost: $1.8

2. spring中应用demo

首先,我们定义一个基本的MessageService接口和一个实现类:

java 复制代码
public interface MessageService {
    void sendMessage(String msg);
}

public class EmailService implements MessageService {
    @Override
    public void sendMessage(String msg) {
        System.out.println("发送电子邮件:" + msg);
    }
}

然后,我们创建一个装饰器接口和实现类:

java 复制代码
public interface MessageServiceDecorator extends MessageService {
    // 可以添加额外的功能
}

public class EmailServiceDecorator implements MessageServiceDecorator {
    private MessageService messageService;

    public EmailServiceDecorator(MessageService messageService) {
        this.messageService = messageService;
    }

    @Override
    public void sendMessage(String msg) {
        // 在发送消息之前或之后添加额外的功能
        System.out.println("在发送消息之前执行一些操作...");
        messageService.sendMessage(msg);
        System.out.println("在发送消息之后执行一些操作...");
    }
}

在Spring的配置类中,我们定义MessageService bean,并使用它来创建装饰器:

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public MessageService messageService() {
        return new EmailService();
    }

    @Bean
    public MessageService decoratedMessageService(MessageService messageService) {
        return new EmailServiceDecorator(messageService);
    }
}

最后,我们可以在Spring的上下文中使用这个MessageService bean:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessageClient {

    private final MessageService messageService;

    @Autowired
    public MessageClient(MessageService messageService) {
        this.messageService = messageService;
    }

    public void sendMessage(String msg) {
        messageService.sendMessage(msg);
    }
}
相关推荐
FastBean5 分钟前
Jackson View Extension Spring Boot Starter
java·后端
Seven971 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55111 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河11 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程14 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅15 小时前
Java面向对象入门(类与对象,新手秒懂)
java
静水流深_沧海一粟16 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder16 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
初次攀爬者16 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq