设计模式-装饰器模式

目录

🤞1.了解装饰器模式

🚍2.装饰器的各个组件

🍳3.案例实操

🍟4.测试

🤶5.优缺点

1.了解装饰器模式

  • 也叫包装设计模式,属于结构型模式
  • 它是作为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构
  • 给对象增加功能,一般两种方式继承或关联组合
  • 将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为来增强功能,这个就是装饰器模式

2.装饰器的各个组件

  • 抽象组件(Component):定义装饰方法的规范
  • 被装饰者(ConcreteComponent):Component的具体实现,就是要装饰的具体对象
  • 装饰者组件(Decorator):定义具体装饰者的行为规范,和Component角色有相同的接口,持有组件(Component)对象的实例引用
  • 具体装饰物(ConcreteDecorator): 负责给构件对象装饰附加的功能

3.案例实操

  • 抽象组件

//抽象组件
public interface Bike {

    //描述
    String getDesc();
    //价格
    int getPrice();
}
  • 被装饰者

//具体的被装饰者1
public class BigBike implements Bike{

    private String desc="大号自行车";

    @Override
    public String getDesc() {
        return desc;
    }

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

//具体的被装饰者2
public class SmallBike implements Bike{

    private String desc="小号自行车";
    @Override
    public String getDesc() {
        return desc;
    }

    @Override
    public int getPrice() {
        return 100;
    }
}
  • 装饰器

//装饰器
public class BikeDecorator implements Bike{

    private String desc="装饰器";

    @Override
    public String getDesc() {
        return null;
    }

    @Override
    public int getPrice() {
        return 0;
    }
}
  • 具体的装饰器
//具体的装饰器1
public class RSCBikeDecorator extends BikeDecorator {

    private String desc = "增加一个防爆胎";

    //以构造器的形式传入被装饰者
    private Bike bike;

    public RSCBikeDecorator(Bike bike) {
        this.bike = bike;
    }

    @Override
    public String getDesc() {
        return bike.getDesc() + "," + desc;
    }

    @Override
    public int getPrice() {
        return bike.getPrice() + 100;
    }
}

//具体的装饰器2
public class SunNaBIkeDecorator extends BikeDecorator{

    private String desc="增加一个喇叭";

    //以构造器的形式传入被装饰者
    private Bike bike;

    public SunNaBIkeDecorator(Bike bike) {
        this.bike = bike;
    }

    @Override
    public String getDesc() {
        return bike.getDesc()+","+desc;
    }

    @Override
    public int getPrice() {
        return bike.getPrice()+100;
    }
}

4.测试

public class Main {
    public static void main(String[] args) {
        Bike bigBike = new BigBike();

        bigBike = new RSCBikeDecorator(bigBike);
        bigBike = new SunNaBIkeDecorator(bigBike);
        bigBike = new SunNaBIkeDecorator(bigBike);
        System.out.println(bigBike.getDesc()+","+bigBike.getPrice());
    }
}

5.优缺点

  • 优点:
    • 装饰模式与继承关系的目的都是要扩展对象的功能,但装饰模式可以提供比继承更多的灵活性。
    • 使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,原有代码无须改变,
  • 缺点:
    • ​​​​​​​装饰模式增加了许多子类,如果过度使用会使程序变得很复杂(多层包装)
    • 增加系统的复杂度,加大学习与理解的难度
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会敲代码的小张

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

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

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

打赏作者

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

抵扣说明:

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

余额充值