JAVA设计模式之装饰者模式

JAVA设计模式之装饰者模式

1. 定义

动态的给对象添加一些额外的职责,从而实现功能的扩展

提供了比继承更有弹性的替代方案(扩展原有功能)

2. 类型

结构型

3. 场景

  1. 在不影响对象的情况下,以透明的方式动态的给对象添加额外的职责
    2… 动态的给一个对象添加功能,这些功能可以动态的撤销

4. 优点

继承的有利补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能

通过使用不同装饰类以及这些类的排列组合,可以实现不同的效果

符合开闭原则

5.缺点

会出现更多的代码,更多的类,增加程序复杂性

动态装饰时,多层装饰时会更复杂

6. 相关的设计模式

装饰者模式和代理模式

装饰者模式和适配器模式

7. 例证

  1. 你的女朋友外出,但是不知道穿什么衣服,这个时候,机智的你采用装饰者模式给你女朋友提供了n多种方案,jk装,汉服装等等,就这个样子你带着服装和你女朋友一起出去了,高兴的你即使累了也要完成啊
  2. 你的女朋友想吃煎饼果子,煎饼果子,外加的装饰有,辣酱,甜酱,香肠,脆饼,生菜等等,这个时候你也不知道选择啥,索性都加上去了。

8. coding

1. 抽象的煎饼

package com.maidou.learning.design.structure.decorator;

/**
 * @Author maichen
 * @Description : 抽象的煎饼
 * @Date 23:20 2022/10/17
 **/
public abstract class ABattercake {

    protected abstract String getDesc();

    protected abstract int price();
}

2. 具体的煎饼

package com.maidou.learning.design.structure.decorator;

public class Battercake extends ABattercake{
    @Override
    public String getDesc() {
        return "煎饼";
    }

    @Override
    public int price() {
        return 8;
    }
}

3.抽象的装饰者

public class AbstractDecorator extends ABattercake{

    private ABattercake aBattercake;

    public AbstractDecorator(ABattercake aBattercake) {
        this.aBattercake = aBattercake;
    }

    @Override
    protected String getDesc() {
        return this.aBattercake.getDesc();
    }

    @Override
    protected int price() {
        return this.aBattercake.price();
    }
}

4. 具体的装饰者

package com.maidou.learning.design.structure.decorator;

public class EggDecorator extends AbstractDecorator{

    public EggDecorator(ABattercake aBattercake) {

        super(aBattercake);
    }

    @Override
    protected String getDesc() {

        return super.getDesc() + "加一根鸡蛋";
    }

    @Override
    protected int price() {

        return super.price() + 2;
    }
}


package com.maidou.learning.design.structure.decorator;

public class SausageDecorator extends AbstractDecorator{

    public SausageDecorator(ABattercake aBattercake) {
        super(aBattercake);
    }

    @Override
    protected String getDesc() {

        return super.getDesc() + "加一根香肠";
    }

    @Override
    protected int price() {

        return super.price() + 5;
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vvGJpHnd-1666020895897)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221017233437140.png)]

9. 源码应用

  1. jdk Reader BufferReader

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rXNqVtk5-1666020882286)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221017231107387.png)]

  1. spring

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5fgphlEU-1666020882288)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221017231429724.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值