装饰器模式(结构型)

本文详细介绍了装饰器模式的定义,如何在Java中通过BaseCake和其装饰器实现功能扩展,对比了其与继承的区别,并讨论了其优点和局限性。读者将理解如何利用装饰器为对象添加额外行为而不改变其原有结构。

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

定义

  1. 再不改变原有对象的基础上,将功能附加到对象上,提供了比继承更具有弹性的替代方案

适用场景

  1. 用于扩展一个类的功能,添加职责
  2. 动态的给对象添加功能,这些功能可以再动态的撤销

装饰器实例

// 基类接口
public abstract class Cake {
    public abstract String getMsg();

    public abstract int getPrice();
}

// 接口实现
public class BaseCake extends Cake {

    @Override
    public String getMsg() {
        return "蛋糕";
    }

    @Override
    public int getPrice() {
        return 10;
    }
}

// 基类装饰器
public class BaseCakeDecorator extends BaseCake{
    private BaseCake baseCake;

    // 必须创建构造函数
    public BaseCakeDecorator(BaseCake baseCake) {
        this.baseCake = baseCake;
    }

    public String getMsg() {
        return this.baseCake.getMsg();
    }

    public int getPrice() {
        return this.baseCake.getPrice();
    }
}

// 指定装饰器继承基类装饰器
public class BaseCakeWithAppleDecorator extends BaseCakeDecorator {
    public BaseCakeWithAppleDecorator(BaseCake baseCake) {
        super(baseCake);
    }

    public String getMsg() {
        return super.getMsg() + "1个苹果";
    }

    public int getPrice() {
        return super.getPrice() + 1;
    }
}

// 指定装饰器继承基类装饰器
public class BaseCakeWithEggDecorator extends BaseCakeDecorator {
    public BaseCakeWithEggDecorator(BaseCake baseCake) {
        super(baseCake);
    }

    public String getMsg() {
        return super.getMsg()  + "1个鸡蛋";
    }

    public int getPrice() {
        return super.getPrice() + 5;
    }
}

public class Test {
    public static void main(String[] args) {
        BaseCake baseCake = new BaseCake();
        baseCake = new BaseCakeWithEggDecorator(baseCake);
        baseCake = new BaseCakeWithAppleDecorator(baseCake);
        System.out.println(baseCake.getMsg()+ "总价," + baseCake.getPrice());
    }
}

实现

  1. inputStream
  2. bufferInputStream
  3. bufferReader
  4. spring transationAwareCacheDecorator
  5. mybatis Cache

与其他设计模式区别

  1. 装饰器是一种特殊的静态代理模式
  2. 装饰器强调自身功能的扩展
  3. 代理强调代理过程的控制

优点

  1. 使继承的有利补充,比继承灵活,不改变原有对象的情况下动态的给一个对象扩展,即插即用
  2. 不同的装饰器进行排列组合,可以实现不同的效果
  3. 遵循开闭原则

缺点

  1. 会出现更多的代码,更多的类,增加程序的复杂性
  2. 动态装饰,多层装饰会更复杂
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值