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

目录

装饰器设计模式最佳实践

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

以下是一个使用装饰器模式的示例,我们将创建一个简单的咖啡订单系统,其中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);
    }
}
相关推荐
caimouse6 分钟前
ReactOS 窗口系统分析(14):计时器/属性/加速键/热键 — timer.c + prop.c + accelerator.c + hotkey.c
c语言·开发语言·reactos
circuitsosk13 分钟前
Python 模块与包管理:import 机制、虚拟环境与 pip 完全指南
开发语言·python·pip·依赖管理·模块与包
就叫飞六吧13 分钟前
两道门:X-Frame-Options 和 SameSite 到底谁管什么
开发语言·chrome·ai编程
fl17683128 分钟前
基于C#WPF实现的内存加速球清理类似360加速球内存清理
开发语言·c#·wpf
weixin_4407305032 分钟前
python+request实现接口-小结
开发语言·python
QQ_216962909637 分钟前
【项目编号:project95315】SpringBoot公共自习室管理系统:座位预约、房间管理、签到核销、公告规则完整实战
java·spring boot·后端
ZJU_统一阿萨姆1 小时前
【算子开发】扫描(Scan)与前缀和
开发语言·arm开发·架构·系统架构·硬件架构
-凌凌漆-1 小时前
【C语言】结构体typedef struct与struct的区别
c语言·开发语言
嵌入式阿蔡1 小时前
面试高频考点 01:volatile / 中断 / 堆栈 八股精讲
java·面试·职场和发展·嵌入式实时数据库
秋饼1 小时前
LangChain4j + Java 实现企业级 Text-to-SQL 智能问数系统:从自然语言到安全可控的数据洞察
java·ai·技术分享·后端开发