"一文弄懂"---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篇博客
发布了30 篇原创文章 · 获赞 79 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_45393094/article/details/104859456
今日推荐