设计模式之八:装饰器模式

向一个现有的类添加新的功能,同时又不改变其结构

用装饰类来包装原有的类(通过组合,而不是继承),提供额外的功能。


事例

需求:水果包装进行打包后,分别增加防伪、加固、加急的功能

功能如图
在这里插入图片描述

数据结构如图
在这里插入图片描述

装饰类要继承被装饰类Bag,这样才能代替被装饰类
装饰类:

public abstract class BagDecorator implements Bag {
    protected Bag mBag;

    public BagDecorator(Bag bag) {
        mBag = bag;
    }
}

tips: 抽象类不需要实现接口的方法

实现类:

// 防伪实现类
public class CheckedDecorator extends BagDecorator {
    public CheckedDecorator(Bag bag) {
        super(bag);
    }

    @Override
    public void pack() {
        mBag.pack();
        checked();
    }

    private void checked() {
        // 防伪的业务代码
    }
}

// 加固实现类
public class ReinforceDecorator extends BagDecorator {
    public ReinforceDecorator(Bag bag) {
        super(bag);
    }

    @Override
    public void pack() {
        mBag.pack();
        reinforce();
    }

    private void reinforce() {
        // 加固的业务代码
    }
}

// 加急实现类
public class SpeedDecorator extends BagDecorator {
    public SpeedDecorator(Bag bag) {
        super(bag);
    }

    @Override
    public void pack() {
        mBag.pack();
        speed();
    }

    private void speed() {
        // 加急的业务代码
    }
}

测试:

    public void decorate() {
        AppleBag appleBag = new AppleBag();
        // 用防伪装饰类来包装AppleBag
        Bag bag = new CheckedDecorator(appleBag);
        // 打包和防伪都会执行
        bag.pack();
    }

总结

优点

  • 降低耦合。装饰者和被装饰者可独立发展
  • 扩展功能不通过继承产生而新的子类,简化了系统结构

缺点

  • 多层装饰较复杂,会增加系统复杂性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哈哈哈利波特

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

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

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

打赏作者

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

抵扣说明:

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

余额充值