当前位置: 首页 > article >正文

装饰者模式

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

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

下面是一个简单的装饰者模式的 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 基础功能的前提下,增加了新的行为。

使用时,我们可以这样:

Component component = new ConcreteComponent();
component = new ConcreteDecoratorA(component);
component = new ConcreteDecoratorB(component);
component.operation();

输出结果:

ConcreteComponent operation
ConcreteDecoratorA added behavior
ConcreteDecoratorB added behavior

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


http://www.kler.cn/a/106684.html

相关文章:

  • 让空间计算触手可及,VR手套何以点石成金?
  • WPF中如何使用区域导航
  • 给阿里云OSS绑定域名并启用SSL
  • 【NLP】医学搜索Query相关性判断【阿里云:天池比赛】
  • vite + vue3 + ts解决别名引用@/api/user报错找不到相应的模块
  • kubernetes简单入门实战
  • R语言生物群落(生态)数据统计分析与绘图实践技术应用
  • 数组的最长递减子序列
  • Project Costs
  • 第四章 文件管理 十、文件系统的全局结构
  • 前端工程化面试题及答案【集合】
  • 网络通信 | 内网穿透
  • 机器视觉3D项目评估的基本要素及测量案例分析
  • Pandas数据导入和导出:CSV、Excel、MySQL、JSON
  • 大语言模型(LLM)综述(四):如何适应预训练后的大语言模型
  • QQ云端机器人登录系统php源码开心版
  • PHP:json_encode和json_decode用法
  • Python 中的内存泄漏问题
  • AD9371 官方例程HDL详解之JESD204B RX侧时钟生成
  • docker部署prometheus+grafana服务器监控(一)
  • 【Docker】Linux网桥连接多个命名空间
  • 3.线性神经网络
  • 7.MySQL复合查询
  • seacms_CNVD-2020-22721_v10.1漏洞分析与复现
  • [Java]前中后序遍历二叉树/递归与非递归
  • 结构体数组经典运用---选票系统