"一文弄懂"---JAVA装饰者设计模式(Demo详解)

非常高兴你能来阅读,本文会带你详细分析JAVA之装饰者模式。愿我们共同进步成长!


一.装饰者模式定义

  • 动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。

  • 要实现装饰者模式,注意以下几点内容:
  • a.装饰者类要实现真实类同样的接口
  • b.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入)
  • c.装饰类对象在主类中接受请求,将请求发送给真实的对象(相当于已经将引用传递到了装饰类的真实对象)
  • d.装饰者可以在传入真实对象后,增加一些附加功能(因为装饰对象和真实对象都有同样的方法,装饰对象可以添加一定操作在调用真实对象的方法,或者先调用真实对象的方法,再添加自己的方法)
  • e.不用继承

二.案例详解

场景:假如你是一个豆浆店的老板,你的主要任务是卖原味豆浆,但是顾客有时候不想只喝原味豆浆往往还会在这个基础之上增加一些配料,例如煎蛋、糖、火腿片等等,每个配料的价格都不一样,不管你怎么配配料,最终价格是豆浆基础价加上每一种所选配料价格的总和。

  • 先创建一个饮料的接口
//首先定义一个饮品接口
public interface Drink {

    //计算价格
  float cost();

  //描述:饮品是什么 包含什么
  String description();


}

  • 创建一个装饰者基类(所有套餐均在此基础上加)

/*
* 装饰者的基类
*/
public abstract class Decorator implements Drink {

    private Drink drink;

    public Decorator(Drink drink) {
        this.drink = drink;
    }

    //返回饮料的钱
    @Override
    public float cost() {
        return drink.cost();
    }

    //对饮料的描述(饮料的组合是什么)
    @Override
    public String description() {
        return drink.description();
    }
}

  • 创建豆浆 定义价格和描述
*
 * 具体被装饰者的类
*/
//豆浆
public class SoyaBeanMilk  implements Drink{
    @Override
    public float cost() {
        return 10;
    }

    @Override
    public String description() {
        return "纯豆浆";
    }
}
  • 顾客点了豆浆后决定加糖,这时候后我们就可以在原有的基础上修改描述和价格
//加糖的豆浆
public class SugarDecorator extends  Decorator {


    public SugarDecorator(Drink drink) {
        super(drink);
    }

    @Override
    public float cost() {
        return super.cost()+1;
    }

    @Override
    public String description() {
        return super.description()+"+糖";
    }
}

  • 顾客决定加个煎蛋
public class EggDecorator extends  Decorator {
    public EggDecorator(Drink drink) {
        super(drink);
    }


   //重写鸡蛋的价格
    @Override
    public float cost() {
        return super.cost()+2;
    }

    //重写描述+鸡蛋
    @Override
    public String description() {
        return super.description()+"+煎蛋";
    }


}
  • 顾客购买完毕测试
public class TestDemo {

    public static void main(String[] args) {
        //普通的豆浆  价格:10
        Drink drink = new SoyaBeanMilk();
        //豆浆+糖 价格:10+1
        SugarDecorator sugarDecorator = new SugarDecorator(drink);
        //豆浆+糖+鸡蛋 价格:10+1+2=13
        EggDecorator eggDecorator = new EggDecorator(sugarDecorator);

        System.out.println("你要支付的钱:"+eggDecorator.cost()+"元");
        System.out.println("你的套餐情况是:"+eggDecorator.description());

    }
}

你要支付的钱:13.0元
你的套餐情况是:纯豆浆++煎蛋

三.Java的IO结构的装饰者

  • 在Java源码中典型的装饰者模式就是java I/O, 其实装饰者模式也有其缺点,就是产生了太多的装饰者小类,有类爆炸的趋势。

在这里插入图片描述


  • This chapter is over. Thank you for reading

  • The best investment is in yourself.

在这里插入图片描述

  • 2020.03.14 来自辰兮的第27篇博客
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
责任链设计模式是一种行为型设计模式,用于将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。该模式将这些对象串成链,并沿着这条链传递请求,直到有一个对象能够处理它为止。 责任链模式的核心是定义一个处理请求的抽象类或接口,然后让多个具体的处理者对象继承或实现这个类/接口。每个具体的处理者对象都包含一个对下一个处理者对象的引用,形成一个链式结构。 当一个请求进入责任链时,责任链中的每个处理者都有机会处理该请求。如果可以处理请求,则进行处理;如果不能处理,则将请求传递给下一个处理者,直到有一个处理者能够处理它。 责任链模式的关键点是要找到合适的处理者顺序和条件。通常情况下,责任链模式适用于以下情况: 1. 有多个对象可以处理同一类型的请求,但具体由哪个对象来处理由运行时决定。 2. 不明确请求的接收者,希望请求在一个对象链中流动,直到被处理。 3. 需要动态地指定可以处理请求的对象集合。 使用责任链模式可以实现请求发送者和接收者的解耦,增加代码的灵活性和可扩展性。但同时也需要注意责任链的长度和效率问题,避免责任链过长或造成性能问题。 总结一下,责任链设计模式是一种将请求发送者和接收者解耦的设计模式,通过将多个处理者对象串成链,沿着这条链传递请求,直到有一个处理者能够处理它。这样可以增加代码的灵活性和可扩展性,适用于有多个对象可以处理同一类型请求的情况。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员可乐丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值