首页 > 其他分享 >装饰器模式:动态给一个对象添加一些额外的职责

装饰器模式:动态给一个对象添加一些额外的职责

时间:2023-04-25 10:59:05浏览次数:32  
标签:器类 额外 职责 component Component public 添加 operation 装饰

当我们想要在不改变原有对象的结构和功能的基础上,动态地给一个对象添加一些额外的行为或职责时,可以使用装饰器模式。

在装饰器模式中,通常会定义一个抽象装饰器类和具体的装饰器类。抽象装饰器类和被装饰对象实现同样的接口,而具体的装饰器类则包含了一个指向被装饰对象的引用,并且在其基础上增加了额外的行为或职责。

通过这种方式,我们可以在运行时动态地给一个对象添加所需要的行为或职责,而不必修改原有对象的结构或代码。同时,由于采用了组合的方式,我们可以灵活地对多个装饰器进行组合,以满足不同的需求。

装饰器模式广泛应用于Java中的IO流、Swing中的GUI组件等领域,也是Python中的装饰器(@decorator)机制的基础。

示例代码:

首先我们定义一个接口 Component 作为被装饰对象和抽象装饰器类的共同接口。

public interface Component {
    void operation();
}

然后定义一个具体的实现类 ConcreteComponent

public class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("执行具体操作");
    }
}

接下来定义一个抽象装饰器类 Decorator

public abstract class Decorator implements Component {
    protected Component component;
    
    public Decorator(Component component) {
        this.component = component;
    }
    
    @Override
    public void operation() {
        component.operation();
    }
}

最后,我们定义一个具体的装饰器类 ConcreteDecorator

public class ConcreteDecorator extends Decorator {
    public ConcreteDecorator(Component component) {
        super(component);
    }
    
    @Override
    public void operation() {
        super.operation();
        addBehavior();
    }
    
    private void addBehavior() {
        System.out.println("添加额外的行为");
    }
}

使用时,我们可以构造一个原有的 ConcreteComponent 对象,然后通过不断地用具体的装饰器类进行包装,来动态地给其添加额外的行为。例如:

Component component = new ConcreteComponent();
component.operation(); // 输出 "执行具体操作"

Component decorator1 = new ConcreteDecorator(component);
decorator1.operation(); // 输出 "执行具体操作",然后输出 "添加额外的行为"

Component decorator2 = new ConcreteDecorator(decorator1);
decorator2.operation(); // 输出 "执行具体操作",然后输出 "添加额外的行为",再次输出 "添加额外的行为"

在这个示例中,我们首先创建了一个 ConcreteComponent 对象,然后将其分别用 ConcreteDecorator 类进行包装。每一次包装都会动态地给原有对象添加额外的行为,并且不影响原有对象的结构和功能。

标签:器类,额外,职责,component,Component,public,添加,operation,装饰
From: https://www.cnblogs.com/li053/p/17351953.html

相关文章

  • 全球首发:Tiny10 2023 x86最终版及类似win10精简版/Win K/N版 单独添加Windows Media P
    情况:1.Windows功能列表中没有媒体功能(MediaFeatures),或该项下没有Windowsmediaplayer选项2.普通在Windows-设置-功能-可选功能中单独可以添加WMP,但实际并无效果,该组件需要相关功能包打开情况下才可以安装成功,否则尽管显示已安装,但实际Program目录下并无WindowsMediaPlayer出......
  • vue3+jointjs 使用模板添加元素
    关于如何在Vue3和JointJS中使用拖拽模板来创建节点元素,可以按照以下步骤进行:1.安装JointJS使用npm进行安装:```npminstalljointjs```2.在Vue3中创建JointJS容器在Vue3中创建一个组件,用于创建JointJS的画布和节点。在组件的生命周期方法`mounted`......
  • 20230425001 - DataGridView绑定了数据之后, 再添加CheckBox列的解决方案
                 DataGridViewCheckBoxColumncheckBoxColumn=newDataGridViewCheckBoxColumn();           checkBoxColumn.Name="select";           checkBoxColumn.HeaderText="选择";           dgv_M.Columns.Inse......
  • STM32 DSP库的添加
    DSP库的添加软件环境:STM32CubeMX、Keil5硬件环境:STM32F4071.使用STM32CubeMX生成Keil5工程注意:点击Project->Settings打开工程设置窗口,点击CodeGenerator选项卡,在STM32CubeFirmwareLibraryPackage中选择Copyallusedlibrariesintotheprojectfolder。2.打开并配......
  • 将集合中的某一条数据添加到首位或者最后一位
    直接上代码publicstaticvoidmain(String[]args){List<Customer>addressList=newArrayList<>();Customerc1=newCustomer();c1.setId("1");c1.setName("ckf");addressList.add(c1);......
  • kubectl 命令 --save-config 将部署信息添加到注解,防止deploy或webhook通过注释添加
    1、--save-config为什么需要使用kubctlapply保存配置?kubectl apply<file.yaml>--save-config创建或更新部署,并将部署另存为元数据。文件上说--save-config[=false]:如果为true,则当前对象的配置将保存在其注释中。当您将来要对此对象执行kubectlapply时,这非常有用。为什么......
  • 添加水印
    创建JS文件watermark.jsletwatermark={}letsetWatermark=(arr)=>{letid='1.23452384164.123412416';if(document.getElementById(id)!==null){document.body.removeChild(document.getElementById(id));}//创建一个画布......
  • PowerDesigner 12小技巧-pd修改外键命名规则-pd添加外键
    PowerDesigner12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键1.附加:工具栏不见了调色板(Palette)快捷工具栏不见了PowerDesigner 快捷工具栏palette不见了,怎么重新打开,找回来呢上网搜索了一下”powerdesigner图形工具栏”,找到了找回PowerDesigner工具......
  • docker部署gitlab CI/CD (二)终篇:部署gitlab runner和添加gitlab-ci.yml文件 终极踩坑版
    网上教程很多,但断断续续,先不说大部分都是只截取片段,让人云里雾里,不会的看不懂,懂的不需要看,根据步骤跑不起来不说,改了一堆,完全不解释为什么,也分不清是官方要求还是作者自己夹带的私货。痛定思痛,抛弃任何教程,根据报错实时改进,于2023年4月24日完成此篇。官方文档:https://docs.g......
  • scn增量备份恢复dataguard从库(出现gap后主库有添加新的数据文件)
    环境:OS:Centos7DB:19.3.0.0 1.正常同步情况下的scn主从是一致的主库查询:SQL>selectSEQUENCE#,FIRST_CHANGE#,NEXT_CHANGE#,APPLIED,STATUSfromv$archived_logtwherename='tnsslavea';SEQUENCE#FIRST_CHANGE#NEXT_CHANGE#APPLIEDSTATUS-----------------......