1 如何动态地给一个类增加功能-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何动态地给一个类增加功能

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-09 14:25 次阅读

1、什么是装饰器模式?

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.

装饰器模式(Decorator Pattern):动态的给一个对象添加额外的职责,就增加功能来说, 装饰模式相比生成子类更为灵活。

说人话:一般的,我们为了扩展一个类经常使用继承方式实现,随着扩展功能的增多,子类会很膨胀。这时候期望在不改变类对象及其类定义的情况下,为对象添加额外功能,这就是装饰器模式。

2、装饰器模式定义

图片

①、Component抽象构件

Component是一个接口或者是抽象类, 就是定义我们最核心的对象, 也就是最原始的对象。

②、ConcreteComponent 具体构件

ConcreteComponent是最核心、 最原始、 最基本的接口或抽象类的实现, 你要装饰的就是它。

③、Decorator装饰角色

一般是一个抽象类, 实现接口或者抽象方法, 它里面可不一定有抽象的方法, 在它的属性里必然有一个private变量指向Component抽象构件。

④、ConcreteDecorator 具体装饰角色

ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类, 你要把你最核心的、 最原始的、 最基本的东西装饰成其他东西

3、装饰器模式通用代码实现

/**
 * 抽象构件
 */
public abstract class Component {
    public abstract void operator();
}
/**
 * 具体构件
 */
public class ConcreteComponent extends Component{
    @Override
    public void operator() {
        System.out.println("doSomething");
    }
}
/**
 * 抽象装饰者
 */
public abstract class Decorator extends Component{
    private Component component;

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

    // 委托给被修饰者执行
    @Override
    public void operator() {
        this.component.operator();
    }
}
public class ConcreteDecorator1 extends Decorator{
    // 定义被修饰者
    public ConcreteDecorator1(Component component){
        super(component);
    }

    // 定义自己的修饰方法
    public void method1(){
        System.out.println("修饰方法 method1");
    }
    @Override
    public void operator() {
        this.method1();
        super.operator();
    }
}
public class ConcreteDecorator2 extends Decorator{
    // 定义被修饰者
    public ConcreteDecorator2(Component component){
        super(component);
    }

    // 定义自己的修饰方法
    public void method2(){
        System.out.println("修饰方法 method2");
    }
    @Override
    public void operator() {
        super.operator();
        this.method2();
    }
}

客户端测试:

public class DecoratorClient {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        // 第一次修饰
        component = new ConcreteDecorator1(component);
        // 第二次修饰
        component = new ConcreteDecorator2(component);
        // 修饰后运行
        component.operator();
    }
}

打印结果:

图片

4、装饰器模式优点

①、装饰模式可以动态地扩展一个实现类的功能。

②、装饰类和被装饰类可以独立发展, 而不会相互耦合。换句话说, Component类无须知道Decorator类, Decorator类是从外部来扩展Component类的功能, 而Decorator也不用知道具体的构件。

③、装饰模式是继承关系的一个替代方案。我们看装饰类Decorator, 不管装饰多少层, 返回的对象还是Component, 实现的还是is-a的关系

5、装饰器模式应用场景

①、需要扩展一个类的功能, 或给一个类增加附加功能。

②、需要动态地给一个对象增加功能, 这些功能可以再动态地撤销。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8575

    浏览量

    151012
  • 代码
    +关注

    关注

    30

    文章

    4779

    浏览量

    68516
收藏 人收藏

    评论

    相关推荐

    在单片机上实现动态加载功能

    本项目是在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他
    发表于 05-30 11:04 1857次阅读

    在Delphi中动态地使用SQL查询语句

    在Delphi中动态地使用SQL查询语句在般的数据库管理系统中,通常都需要应用SQL查询语句来提高程序的动态特性。下面介绍如何在Delphi中实现这种功能。在Delphi中,使用SQ
    发表于 05-10 11:10

    labview中怎么动态地读取波形文件

    我最近在做用声卡当采集卡完成示波器地基本功能,并要求能回放波形,我现在想要解决地是怎样把采集的声音信号保存为波形信号后,怎样读取这个波形文件,是要求动态地读取,比如我录音分钟,波形播放也是
    发表于 06-04 17:24

    DLP®动态地面投影技术介绍

    动态地面投影技术能够在同模块内显示任何图案,该技术通过提供全新的创新型照明功能,重塑消费者对外部照明的认知。创新型照明功能包括汽车光“毯”,可照亮车外的周围区域或从侧视镜投影车辆信息
    发表于 11-07 06:16

    我能否动态地更改IRQ的优先级呢

    程序时,如果异常的优先级高于正在处理的异常的优先级,则异常可以抢占异常处理程序”就我而言,我能否动态地更改 IRQ 的优先级,以便将新事件作为嵌套在同 IRQ 中的新 IRQ 进行处理?
    发表于 12-22 07:38

    石英钟增加音乐报时功能电路图

    石英钟增加音乐报时功能电路图
    发表于 05-18 11:26 13次下载
    <b class='flag-5'>给</b>石英钟<b class='flag-5'>增加</b>音乐报时<b class='flag-5'>功能</b>电路图

    AutoCAD增加计算器功能

    AutoCAD增加计算器功能 在用AutoCAD进行绘图时,经常需要进行些必要的计算工作。尽管Autodesk公司随AutoCAD
    发表于 02-14 17:05 1142次阅读

    电话振铃增加可视判断功能

    电话振铃增加可视判断功能
    发表于 03-04 20:43 881次阅读
    <b class='flag-5'>给</b>电话振铃<b class='flag-5'>增加</b>可视判断<b class='flag-5'>功能</b>

    动态地址计算配合at访问像素_OpenCV3编程入门-源码例程

    OpenCV3编程入门-源码例程全集-用动态地址计算配合at访问像素,感兴趣的小伙伴们可以瞧瞧。
    发表于 09-18 17:02 0次下载

    用于动态地面投影的评估模块和软件工具入门

    用于动态地面投影的评估模块和软件工具入门
    发表于 10-28 11:59 1次下载
    用于<b class='flag-5'>动态地</b>面投影的评估模块和软件工具入门

    用于汽车外部照明的DLP®动态地面投影技术

    用于汽车外部照明的DLP®动态地面投影技术
    发表于 10-31 08:23 2次下载
    用于汽车外部照明的DLP®<b class='flag-5'>动态地</b>面投影技术

    什么是地铁LCD动态地图?-条形智能

    等位置,以方便乘客使用。 地铁LCD动态地图之所以被称为“动态”,是因为它不仅仅是简单的地图,而且还能够实时更新车辆的位置、到站时间等信息。同时,它还可以根据乘客的位置和目的地,提
    的头像 发表于 08-03 17:11 2231次阅读

    在单片机上实现动态加载功能的函数库介绍

    本项目是在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他
    的头像 发表于 11-09 10:55 1531次阅读

    动态地面投影应用要求

    德赢Vwin官网 网站提供《动态地面投影应用要求.pdf》资料免费下载
    发表于 09-05 11:32 0次下载
    <b class='flag-5'>动态地</b>面投影应用要求

    DLP3021-Q1动态地面投影系统设计

    德赢Vwin官网 网站提供《DLP3021-Q1动态地面投影系统设计.pdf》资料免费下载
    发表于 09-21 09:36 0次下载
    DLP3021-Q1<b class='flag-5'>动态地</b>面投影系统设计