装饰者模式

装饰者模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来动态改变对象的行为。

装饰者模式在 Java 中的应用非常广泛,例如在 Java I/O 类库中就大量使用了装饰者模式。

下面是一个简单的装饰者模式的 Java 实现:

java 复制代码
// 定义组件接口
public interface Component {
    void operation();
}

// 定义具体组件
public class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("ConcreteComponent operation");
    }
}

// 定义装饰者基类
public abstract class Decorator implements Component {
    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        component.operation();
    }
}

// 定义具体装饰者
public class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        addedBehavior();
    }

    public void addedBehavior() {
        System.out.println("ConcreteDecoratorA added behavior");
    }
}

public class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        addedBehavior();
    }

    public void addedBehavior() {
        System.out.println("ConcreteDecoratorB added behavior");
    }
}

在这个例子中,ConcreteComponent 是我们的具体组件,ConcreteDecoratorAConcreteDecoratorB 是具体的装饰者,它们在不改变 ConcreteComponent 基础功能的前提下,增加了新的行为。

使用时,我们可以这样:

java 复制代码
Component component = new ConcreteComponent();
component = new ConcreteDecoratorA(component);
component = new ConcreteDecoratorB(component);
component.operation();

输出结果:

java 复制代码
ConcreteComponent operation
ConcreteDecoratorA added behavior
ConcreteDecoratorB added behavior

这样,我们就实现了在运行时动态地为对象添加新的功能。

相关推荐
Mr1ght8 分钟前
为什么 InheritableThreadLocal 在 Spring 线程池中“偶尔”能传递变量?——一次线程池上下文传播的误解
java·spring
毕设源码-赖学姐17 分钟前
【开题答辩全过程】以 基于Java的保定理工科研信息管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
JIngJaneIL37 分钟前
基于Java+ vue智慧医药系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
2501_9167665441 分钟前
【Spring框架】SpringJDBC
java·后端·spring
谷哥的小弟1 小时前
Spring Framework源码解析——ApplicationContextInitializer
java·spring·源码
布谷歌1 小时前
在java中实现c#的int.TryParse方法
java·开发语言·python·c#
while(1){yan}1 小时前
网络基础知识
java·网络·青少年编程·面试·电脑常识
Ulana1 小时前
计算机基础10大高频考题解析
java·人工智能·算法
黄俊懿1 小时前
【深入理解SpringCloud微服务】Seata(AT模式)源码解析——@GlobalTransactional注解与@globalLock生效的原理
java·spring cloud·微服务·云原生·架构·系统架构·架构师
wheelmouse77881 小时前
一个优雅、通用、零侵入的 CSV 导出工具类(Java 实战)
java·开发语言