SpringBoot日常:装饰器模式应用

前言

对于很多程序员,平时写代码为了方便,可能一股脑就按面向过程那样一下把业务逻辑编写下来,少有会去额外思考设计模式或者算法。这种情况其实不利于我们的编码维护,在本文,将介绍设计模式中的观察者模式,通过本文的介绍将帮助你快速理解和应用。

1、什么是装饰器模式?

装饰器模式是一种结构型设计模式,是在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式

2、装饰器模式的结构

装饰器模式包括以下几个角色:
(1)抽象构建Component
定义了被装饰对象的接口或抽象类,也是所有具体组件的共同父类
(2)具体构建ConcreteComponent
实现了Component接口的具体对象,是被装饰对象的基本实现
(3)装饰角色Decorator
保持一个指向Component对象的引用,并定义与Component接口一致的接口。
Decorator还可以维护一个装饰器链,以便动态地添加和删除装饰器对象
(4)具体装饰角色ConcreteDecorator
通过添加一些额外的行为来扩展Component对象的功能,它们实现了Decorator接口并且具有被装饰对象的引用。

3、装饰器模式的实现

假设我们去早餐店购买肠粉,需要给每份肠粉添加不同的配菜,我们可以使用装饰器模式来动态添加配料,而无需为每种可能
的配料创建一个子类。

创建一个粉类的抽象构建Component

//抽象构建
public interface Powder {
	//价格
    BigDecimal getCost();
	//描述
    String  getDesc();
}

创建一个肠粉类的具体构建Component

//具体构建ConcreteComponent
public class RollPowder implements Powder{

    @Override
    public BigDecimal getCost() {
        return new BigDecimal("4.0");
    }

    @Override
    public String getDesc() {
        return "斋粉";
    }
}

创建一个装饰角色Decorator的抽象类

//Decorator
abstract class PowderDecorator implements Powder{

    private BigDecimal price = BigDecimal.ZERO;

    protected final Powder decoratedPowder;

    public PowderDecorator(Powder powder){
        this.decoratedPowder = powder;
    }

    @Override
    public BigDecimal getCost(){
        return decoratedPowder.getCost();
    }

    @Override
    public String  getDesc(){
        return decoratedPowder.getDesc();
    }
}

创建一个具体装饰角色ConcreteDecorator的实现类

该类装饰是加鸡蛋

public class EggDecorator extends PowderDecorator {

    private BigDecimal price = new BigDecimal(1);

    public EggDecorator(Powder powder) {
        super(powder);
    }

    @Override
    public BigDecimal getCost() {
        return super.getCost().add(price);
    }

    @Override
    public String getDesc() {
        return super.getDesc() + ",加蛋";
    }
}

接口调用测试

@GetMapping(value = "/decorator", produces = MediaType.APPLICATION_JSON_VALUE)
    public void decorator() {
        Powder powder = new RollPowder();
        powder = new EggDecorator(powder);
        System.out.println(powder.getCost());
        System.out.println(powder.getDesc());
    }

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值