首页 > 编程语言 >java设计模式--装饰器模式

java设计模式--装饰器模式

时间:2024-06-22 22:20:38浏览次数:27  
标签:java -- component Component public 对象 operation 设计模式 装饰

装饰器模式是一种结构型设计模式,它允许你动态地向对象添加额外的行为。装饰器模式通过将对象包装在一个装饰器类中,以提供额外的功能,而不是修改原始对象的结构。

装饰器模式主要解决的问题是在不改变现有对象结构的情况下,动态地添加功能或修改行为。它可以避免使用子类继承的方式引入大量的子类,从而保持类结构的简洁性和灵活性。

需要使用装饰器模式的时候,通常有以下情况:

  1. 当我们希望向现有对象添加额外的功能,但又不想修改其原始类或创建大量的子类时,可以使用装饰器模式。
  2. 当我们需要动态地添加或移除对象的功能时,可以使用装饰器模式。

装饰器模式的优点包括:

  1. 可以动态地向对象添加功能,无需修改原始对象的结构。
  2. 可以通过组合不同的装饰器对象来灵活地扩展对象的功能。

装饰器模式也有一些缺点:

  1. 可能会导致类的数量增加,增加系统复杂性。
  2. 对象的创建和维护变得更加复杂,需要创建多个装饰器对象来实现不同的组合。

适合使用装饰器模式的场景包括:

  1. 当我们需要动态地向对象添加额外的功能,并且不希望修改原始对象的结构时,可以使用装饰器模式。
  2. 当我们需要动态地添加或移除对象的功能时,可以使用装饰器模式。

通过一个简单的代码示例来说明装饰器模式的使用:

// 组件接口
interface Component {
    void operation();
}

// 原始组件
class ConcreteComponent implements Component {
    public void operation() {
        System.out.println("Performing operation on the original component.");
    }
}

// 装饰器基类
abstract class Decorator implements Component {
    protected Component component;

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

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

// 具体装饰器A
class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    public void operation() {
        super.operation();
        System.out.println("Adding extra behavior in ConcreteDecoratorA.");
    }
}

// 具体装饰器B
class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    public void operation() {
        super.operation();
        System.out.println("Adding extra behavior in ConcreteDecoratorB.");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 创建原始组件
        Component component = new ConcreteComponent();

        // 使用装饰器A装饰组件
        Component decoratedComponentA = new ConcreteDecoratorA(component);
        decoratedComponentA.operation();

        // 使用装饰器B装饰组件
        Component decoratedComponentB = new ConcreteDecoratorB(component);
        decoratedComponentB.operation();

        // 使用装饰器A和装饰器B同时装饰组件
        Component decoratedComponentAB = new ConcreteDecoratorB(new ConcreteDecoratorA(component));
        decoratedComponentAB.operation();
    }
}

在上面的代码中,我们定义了一个组件接口 Component,它包含一个 operation() 方法用于执行操作。

原始组件 ConcreteComponent 实现了 Component 接口,并定义了自己的操作。

装饰器基类 Decorator 也实现了 Component 接口,它包含一个组件对象,并通过调用组件对象的 operation() 方法来实现自己的操作。

具体装饰器 ConcreteDecoratorAConcreteDecoratorB 继承自 Decorator,并在 operation() 方法中添加了额外的行为。

在客户端代码中,我们创建了原始组件和不同的装饰器对象,并将它们组合在一起,以达到动态地添加功能的目的。

这个示例展示了如何使用装饰器模式来动态地向对象添加额外的功能,而无需修改原始对象的结构。

可以通过组合不同的装饰器对象来灵活地扩展对象的功能,而不需要创建大量的子类。

标签:java,--,component,Component,public,对象,operation,设计模式,装饰
From: https://www.cnblogs.com/wenv/p/18262805

相关文章

  • go - Monitoring
    保证高可用的方法1.日志2.链路追踪3.监控 1.业务监控(领导层) OPS/DAU/访问状态httpcode/业务接口(登陆注册聊天上传留言搜索) 2.systemmonitoring (运维) operatingsystem:cpu/memory/diskusage/diskspace/TCP(上w的连接),流量 组件:mysql,redis,kafka 3.......
  • 代码随想录第13天 | 二叉树part01 基础和遍历
    二叉树基础知识二叉树种类满二叉树满二叉树:如果一棵二叉树只有度为0和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树(子节点要么为0,要么为2)若满二叉树的深度为k(即k层,从1开始),则其节点个数为:2^k-1完全二叉树完全二叉树:从上到下,从左到右,都是连续的。满二叉树一......
  • Transaction事务
    SpringTransaction示例1Transactionsample1.1配置文件<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance......
  • FastJson使用详解
    FastJson文章目录第一章FastJson使用详解这一篇就够了第二章FastJsonHttpMessageConverter类的作用与使用详解第三章Jackson使用详解文章目录FastJson文章目录前言一、FastJson是什么?二、使用步骤1.引入库2.序列化和反序列化Java对象3解析JSON字符串4使用注解......
  • leaflet动态更改wms瓦片请求参数
    需求https://leafletjs.cn/reference.html#tilelayer-wms官方文档这里说了可以添加自定义参数,但是这里的写法,值是固定的如果我们需要添加的参数的值是动态变化的,那么,直接写在options的方式固然是行不通的解决办法重写getTileUrl方法,可以选择继承TilelayerWMS重写一个类,也可......
  • Web网页端IM产品RainbowChat-Web的v7.0版已发布
    一、关于RainbowChat-WebRainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIMSDK (Github地址) 的产品级移动端IM系统)。► 详细介绍:http://www.52im.net/thread-2483-1-1.html► 版本记录:http://www.52im.net/th......
  • 【C#进阶】多线程和异步编程_2024-06-22
    关于多线程和异步编程简单来说,就是多线程并行执行任务提速,异步编程等待不浪费资源,并发集合确保数据访问安全,三者合力提升程序效率与反应能力。1.理解线程想象一下,你在厨房做饭,同时需要洗菜、切菜、炒菜。如果你一个人来做,就需要在这些任务之间来回切换,这很慢。但如果请几个朋友......
  • CentOS更换yum源
    Yum简介Yum是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。更换yum源是为了使用yum下载软件速度变快,默认的yum源为国外,下载速度较慢,使用国内镜像源可以解决这一问题。具体步骤下......
  • 【区分vue2和vue3下的element UI Descriptions 描述列表组件,分别详细介绍属性,事件,方法
    在ElementUI(为Vue2设计)和ElementPlus(为Vue3设计)中,Descriptions(描述列表)组件通常用于展示一系列的结构化信息。然而,需要明确的是,ElementUI官方库中并没有直接名为Descriptions的组件,但在ElementPlus中,该组件是存在的。以下将分别介绍ElementPlus中的De......
  • 黑马:AI+若依
    AI+若依https://www.bilibili.com/video/BV1pf421B71v/?spm_id_from=333.337.search-card.all.click&vd_source=b1acc63fa6d7d73e53111f9e1153f990若依扫盲通义灵码(AI)CRM客户关系管理系统(后台管理系统)选型与搭建:技术选型,环境搭建,框架整合(AI凉凉)设计:基于原型设计库表,接......