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

目录

装饰器设计模式最佳实践

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

以下是一个使用装饰器模式的示例,我们将创建一个简单的咖啡订单系统,其中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);
    }
}
相关推荐
大数据编程之光3 分钟前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
初九之潜龙勿用4 分钟前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net
爪哇学长17 分钟前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
Dola_Pan21 分钟前
C语言:数组转换指针的时机
c语言·开发语言·算法
ExiFengs21 分钟前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring
paj12345678922 分钟前
JDK1.8新增特性
java·开发语言
IT古董29 分钟前
【人工智能】Python在机器学习与人工智能中的应用
开发语言·人工智能·python·机器学习
繁依Fanyi33 分钟前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
慧都小妮子44 分钟前
Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图
java·pdf·.net
m51271 小时前
LinuxC语言
java·服务器·前端