设计模式之装饰器模式

装饰器模式是一种结构型设计模式,用于在不修改原有类代码的情况下动态添加功能。它通过创建包装对象(装饰器)来扩展原始对象(组件)的功能,保持其接口不变,体现了开闭原则。相比继承,装饰器提供了更灵活的扩展方式。在Java的IO中,FilterInputStream就是一个装饰器示例。装饰器模式与代理模式不同,代理模式着重于流程控制,而装饰器关注功能增强,保持对象本质职责不变。
摘要由CSDN通过智能技术生成

装饰器模式

五分钟设计模式 - 05装饰器模式

菜鸟教程 - 装饰器模式

尚硅谷

介绍

装饰器模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰器模式也体现了开闭原则(ocp)。属于结构型模式。

装饰器模式就好像打包一个快递。被装饰器(主体)是快递的物品,它需要装饰器(包装)来包装原有的类,并在保持原有类结构不变的前提下,提供额外的功能

何时使用:在不想增加很多子类的情况下扩展类。

拓展类的功能有两种,一种是继承。继承就是用来拓展类的功能的,但它是对类的层级进行扩展。另一种方法是关联,将一个类嵌套在另一个装饰器类之中,然后在装饰器类中拓展子类方法的功能。这样不需要修改类的层次或者原有的逻辑(灵活)

基本思想如下:

void 装饰器方法() {
   前置拓展功能;
   被装饰对象的方法执行;
   后置拓展功能
}

这个抽象的被装饰器称为Component,而装饰器为Decorator

其中,装饰器Decorator需要去继承Component,因为装饰器作为一个套在别人外面的“盒子”,应该需要让调用方知道,装饰器和被装饰的对象具有同样的功能(只是功能被扩展了变得更加强大)

在这里插入图片描述


实现

public class DecoratorPattern {}

interface Robat {
    void doSomething();
}

class FirstRobot implements Robot {
    @Override
    public void doSomething() {
        // 基本功能
    }
}
// 装饰器对象
class RobotDecorator implements Robot {
    // 被装饰的对象
    private Robot robot;
    public RobotDecorator(Robot robot) {
        this.robot = robot;
    }
    @Override
    public void doSomething() {
        robot.doSomething();
    }
    
    public void doMore() {
        // 拓展功能
    }
}

java的IO的应用

JavaIO的应用

InputStream是一个抽象类,即Component

FilterInputStream过滤器输入流,是一个装饰器类Decorator,它对其余三种输入流进行了扩展

public class FilterInputStream extends InputStream {
    // 被装饰的对象
    protected volatile InputStream in; 
}

代理模式与装饰器模式

代理模式和装饰器模式的区别

代理模式,注重对对象某一功能的流程把控和辅助。它可以控制对象做某些事,重心是为了借用对象的功能完成某一流程,而非对象功能如何。

装饰模式,注重对对象功能的扩展,它不关心外界如何调用,只注重对对象功能的加强,装饰后还是对象本身。

对于代理类,如何调用对象的某一功能是思考重点,而不需要兼顾对象的所有功能

对于装饰类,如何扩展对象的某一功能是思考重点,同时也需要兼顾对象的其它功能,因为再怎么装饰,本质也是对象本身,要担负起对象应有的职责。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值