Java设计模式之装饰者模式

Java设计模式之装饰者模式

在开始之前,先简单了解一下什么是装饰者模式?装饰者模式好比你新买的iPhone13手机,他能正常运作,可以打电话,拍照,上网浏览CSDN,但是你又怕手机摔坏,于是你花钱去贴了一个手机膜,还买了手机壳,对于手机来说,他有了手机膜和手机壳,但是不会影响拍照和上网,那么这就算一个装饰,用手机膜和手机壳装饰了手机,但是没有改变手机原有的结构和功能,下面我用大家最常见的奶茶为例,详细讲解装饰者模式。

首先,大家可以看一下这张图片
结合这张图片,再结合代码,相信你会理解的更清楚
在这里插入图片描述

抽象类奶茶

/**
 * @describe:抽象类奶茶
 * @author: jiazl/
 * @version:v1.0
 * 2022/3/14 10:38  
 */
public  abstract  class AbstractMilkTea {
    /**
     * 描述味道
     * @return
     */
    public abstract String descript();

    /**
     * 得到价格
     * @return
     */
    public abstract Integer getPrice();

}

实体类奶茶

import 装饰者模式.抽象类.AbstractMilkTea;

/**
 * @describe:奶茶实体类
 * @author: jiazl/
 * @version:v1.0
 * 2022/3/14 10:36  
 */
public class MilkTea extends AbstractMilkTea {

    @Override
    public String descript() {
        return "普通奶茶";
    }

    @Override
    public Integer getPrice() {
        return 7;
    }
}

抽象装饰类

/**
 * @describe:抽象装饰类
 * @author: jiazl/
 * @version:v1.0
 * 2022/3/14 10:42  
 */
public abstract  class AbstractDecorator extends AbstractMilkTea{
    /**
     * 抽象奶茶类
     */
    private AbstractMilkTea abstractMilkTea;
    public AbstractDecorator(AbstractMilkTea abstractMilkTea) {
        this.abstractMilkTea = abstractMilkTea;
    }

    @Override
    public String descript() {
        return abstractMilkTea.descript();
    }
    @Override
    public Integer getPrice() {
        return abstractMilkTea.getPrice();
    }


}

装饰者

装饰者1

/**
 * @describe:
 * @author: jiazl/
 * @version:v1.0
 * 2022/3/14 10:46  
 */
public class Decorator1 extends AbstractDecorator {

    public Decorator1(AbstractMilkTea abstractMilkTea) {
        super(abstractMilkTea);
    }

    @Override
    public String descript() {
        return super.descript()+"加布丁";
    }
    @Override
    public Integer getPrice() {
        return super.getPrice()+2;
    }
}
装饰者2
/**
 * @describe:
 * @author: jiazl/
 * @version:v1.0
 * 2022/3/14 10:50  
 */
public class Decorator2 extends AbstractDecorator {
    public Decorator2(AbstractMilkTea abstractMilkTea) {
        super(abstractMilkTea);
    }

    @Override
    public String descript() {
        return super.descript()+"去糖";
    }
    @Override
    public Integer getPrice() {
        return super.getPrice();
    }

}

测试类

import 装饰者模式.实体类.MilkTea;
import 装饰者模式.装饰类.Decorator1;
import 装饰者模式.装饰类.Decorator2;

/**
 * @describe:
 * @author: jiazl/
 * @version:v1.0
 * 2022/3/14 10:51  
 */
public class Test {
    public static void main(String[] args) {

        //实体类奶茶 什么小料都不加,类似于描述中的刚出场的iPhone13
        MilkTea milkTea=new MilkTea();
        System.out.println(milkTea.descript()+milkTea.getPrice());
        //加布丁的奶茶  传入最基本的 需要加料的奶茶
        Decorator1 decorator1=new Decorator1(milkTea);
        System.out.println(decorator1.descript()+decorator1.getPrice());
        //去糖的奶茶
        Decorator2 decorator2=new Decorator2(milkTea);
        System.out.println(decorator2.descript()+decorator2.getPrice());
        //加布丁且去糖的奶茶
        Decorator2 decorator2Test=new Decorator2(decorator1);
        System.out.println(decorator2Test.descript()+decorator2Test.getPrice());


    }
}

运行结果

在这里插入图片描述大家可以把代码拷贝,结合图片运行,详细大家就能理解到装饰者模式的精髓了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值