设计模式之装饰者模式

装饰者模式是一种结构型设计模式,允许在不修改对象的情况下动态添加功能。它与代理模式相似但目的不同:装饰者关注于添加行为,而代理模式着重于控制访问。文章通过Java代码示例解释了装饰者模式的工作原理,并对比了装饰者与代理模式的应用场景。

目录

1、什么是装饰者模式?

2、装饰者模式和代理模式的区别


1、什么是装饰者模式?

        装饰者模式是一种结构型设计模式,它允许在不修改现有对象结构的情况下,动态地添加功能或行为。在装饰者模式中,我们定义了一个装饰者类来包装原始对象,从而扩展其功能或行为。

        以下是一个使用Java代码描述装饰者模式的示例:

        首先,我们定义一个接口Component,它表示一个抽象组件,可以是一个具体对象或者是一个抽象对象,它定义了一个操作方法operation。

public interface Component {
    public void operation();
}

        然后,我们定义一个具体组件ConcreteComponent,实现Component接口,它是我们需要被装饰的原始对象。

public class ConcreteComponent implements Component {
    public void operation() {
        System.out.println("执行原始操作");
    }
}

        接下来,我们定义一个装饰者类Decorator,也实现了Component接口,它包装了一个Component对象,并且具有与Component相同的接口。// 定义了一个抽象类

public abstract class Decorator implements Component {
    protected Component component;

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

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

        在Decorator中,我们持有了一个Component对象,并在其操作方法中调用了Component对象的操作方法。

        最后,我们定义具体的装饰者类ConcreteDecorator,它扩展了Decorator类,并添加了一些额外的操作。

public class ConcreteDecorator extends Decorator {
    public ConcreteDecorator(Component component) {
        super(component);
    }

    public void operation() {
        super.operation();
        addedBehavior();
    }

    public void addedBehavior() {
        System.out.println("执行额外操作");
    }
}

        在ConcreteDecorator中,我们首先调用了Decorator的operation方法,然后再添加了一些额外的操作。

        下面是使用装饰者模式的示例代码:

Component component = new ConcreteComponent(); // 创建原始对象
component.operation(); // 执行原始操作

Component decorator = new ConcreteDecorator(component); // 创建装饰者对象
decorator.operation(); // 执行原始操作和额外操作

        在上面的示例代码中,我们首先创建了一个原始对象ConcreteComponent,然后再创建了一个装饰者对象ConcreteDecorator,并将原始对象作为参数传递给装饰者对象。最后,我们执行装饰者对象的操作方法,它会先执行原始操作,然后再执行额外操作。

        总的来说,装饰者模式可以很方便地扩展原始对象的功能,而且还可以使用多个装饰者对象来对原始对象进行不同程度的扩展。// 是不是发现装饰者模式跟代理模式很像?没错,他就是很像,单从代码功能和作用来说,有时候两者近乎可以看成是同一个东西

2、装饰者模式和代理模式的区别

        装饰者模式和代理模式都是结构型设计模式,它们的实现方式有些相似,但它们的目的和应用场景有所不同

        装饰者模式旨在动态地给一个对象添加额外的职责或行为,同时保持接口的一致性,它以透明的方式扩展对象的功能,不需要对原始对象进行修改。装饰者模式适用于需要在运行时动态地添加或删除功能的情况,以及避免使用继承来扩展功能的情况。

        代理模式则是在不改变原始对象接口的情况下,控制对对象的访问。代理模式可以用于实现远程代理、虚拟代理、保护代理等。代理模式可以隐藏对象的实现细节,也可以在需要的时候,延迟对象的创建和初始化。

        在具体实现上,代理模式一般会持有一个对被代理对象的引用,并在需要的时候将请求转发给被代理对象。而装饰者模式则一般会持有一个对被装饰对象的引用,并在其基础上添加一些额外的职责或行为。// 在实现上可以上没有多大区别,想想静态代理的实现,其中代理类不就可以看成是一个装饰者类吗?

        总的来说,代理模式和装饰者模式都是用于扩展对象功能的模式,但是代理模式的目的是控制访问,而装饰者模式的目的是动态地添加功能。在实际应用中,需要根据具体的需求来选择合适的模式。

        // 所以,你看,他又是一个概念性的东西,想想我们的日常开发过程,在Service层引用了另一个Service对象,像不像在做一个装饰?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swadian2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值