设计模式(十一)装饰者模式

本文介绍了装饰者模式的基本概念,通过示例代码展示了如何利用继承和接口实现方式来增强基础组件的功能,并对比了装饰者模式与代理模式之间的异同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰者模式:

基本类图:
在这里插入图片描述

装饰者模式就是对基础组件进行修饰,装饰者和被装饰者通过继承的方式拥有共同结构,同时被装饰者作为装饰者的一个属性。 这样就可以像代理模式一样,去达到增强component的一些功能。

装饰者模式也不一定要通过继承,同样可以通过接口实现来表达。

public abstract class Component {

    public abstract void operate();
}
public class ConcreteComponent extends Component{
    @Override
    public void operate() {
        System.out.println("do something");
    }
}

public abstract class Decorator extends Component {
    private Component component;
    public Decorator(Component component){
        this.component=component;
    }
    @Override
    public void operate(){
        this.component.operate();
    }
}
public class ConcreteDecorator1  extends Decorator{
    public ConcreteDecorator1(Component component) {
        super(component);
    }
    private void method1(){
        System.out.println("method1 修饰");
    }
    @Override
    public void operate(){
        this.method1();
        super.operate();
    }
}

装饰者模式的优点

  • 装饰类和被装饰类可以独立发展,不会相互耦合,Component类无须知道Decorator类
  • 装饰类是继承关系的一个替代方案
  • 装饰类可以动态扩展一个实现类的功能。

装饰者和代理模式的异同

  • 装饰者模式和代理模式的共同点是代理模式代理类包含一个要代理的对象,装饰者模式装饰器也包含一个要装饰的对象。装饰者模式采用继承模式,而代理模式是采用实现同一个接口。 装饰者和被装饰是is-a关系。
  • 上面一条不一定正确的,代理模式和装饰模式非常像,如果装饰者模式也可以是接口实现的。
  • 装饰者模式和代理模式的区别更在于: 代理模式把当前的行为委托给其他对象执行,代理类负责接口限定: 比如是否可以调用真实角色,是否对发送到真实角色的消息进行加工处理。典型代表是AOP
  • 而装饰者是保证接口不变的情况下加强或减弱累得功能,它是对原始类功能进行修饰使其更丰富或者简单,不做准入条件的判断和准入参数的过滤,装饰者不关心是否可以执行类的功能。典型代表是java.io.*包中的各种输入流和输出流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值