23种设计模式--装饰器模式

这篇博客介绍了如何使用装饰器模式为蛋糕类添加新的特性,如芒果和草莓装饰,同时结合策略模式进行分类处理。通过装饰器模式,可以在不修改原有蛋糕类的基础上扩展其功能,满足开闭原则。测试案例展示了如何动态地为蛋糕添加装饰并计算总价。
摘要由CSDN通过智能技术生成

参考:https://blog.csdn.net/weixin_48052161/article/details/118111642

装饰器模式就是为原有类添加新的东西如:在构造上和方法上;但满足对扩展开发对修改关闭原则!
在这里插入图片描述
对蛋糕进行装饰模式装饰,而装饰器又使用了策略模式进行分类处理!

蛋糕抽象类:

package com.example.dtest.design23.decorator;

import java.math.BigDecimal;

public abstract class Cake {

    public abstract String getCakeMsg();

    public abstract BigDecimal getPrice();

}

基础蛋糕类:

package com.example.dtest.design23.decorator;

import java.math.BigDecimal;

public class BaseCake extends Cake{

    @Override
    public String getCakeMsg() {
        return "我是一个8英寸的普通蛋糕";
    }

    @Override
    public BigDecimal getPrice() {
        return new BigDecimal("68");
    }

}

蛋糕装饰器抽象类:

package com.example.dtest.design23.decorator;

import java.math.BigDecimal;

public abstract class CakeDecorator extends Cake{
    private Cake cake;

    public CakeDecorator(Cake cake){
        this.cake = cake;
    }

    @Override
    public String getCakeMsg() {
        return this.cake.getCakeMsg()+"-初级装饰-";
    }

    @Override
    public BigDecimal getPrice() {
        return this.cake.getPrice().add(new BigDecimal("0"));
    }


}

装饰器实现装饰器类继而实现蛋糕修饰:
修饰1:芒果修饰

package com.example.dtest.design23.decorator;

import java.math.BigDecimal;

public class CakeAddMangoDecorator extends CakeDecorator{
    public CakeAddMangoDecorator(Cake cake) {
        super(cake);
    }

    public String getCakeMsg(){
        return super.getCakeMsg()+"+1个芒果";
    }

    public BigDecimal getPrice(){
        return super.getPrice().add(new BigDecimal("10"));
    }

}

修饰2:草莓修饰

package com.example.dtest.design23.decorator;

import java.math.BigDecimal;

public class CakeAddCrapeDecorator extends CakeDecorator{
    public CakeAddCrapeDecorator(Cake cake) {
        super(cake);
    }

    public String getCakeMsg(){
        return super.getCakeMsg()+"+1个葡萄";
    }

    public BigDecimal getPrice(){
        return super.getPrice().add(new BigDecimal("5"));
    }

}

测试类:

package com.example.dtest.design23.decorator;

public class DecoratorTest {

    public static void main(String[] args) {

        Cake cake = null;
        //普通蛋糕
        cake = new BaseCake();
        System.out.println(cake.getCakeMsg() + ",价格:" + cake.getPrice());
        //加一个芒果
        cake = new CakeAddMangoDecorator(cake);
        System.out.println(cake.getCakeMsg() + ",价格:" + cake.getPrice());
        //加一个葡萄
        cake = new CakeAddCrapeDecorator(cake);
        System.out.println(cake.getCakeMsg() + ",价格:" + cake.getPrice());
        //再加一个芒果
        cake = new CakeAddMangoDecorator(cake);
        System.out.println(cake.getCakeMsg() + ",价格:" + cake.getPrice());

    }

}

只表示装饰模式,功能在第一个装饰抽象就可以完成了!!!!
装饰器模式主要为类扩展方法和构造等,因为它聚合了要装饰的对象!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值