ToB企服应用市场:ToB评测及商务社交产业平台

标题: quarkus依赖注入之八:装饰器(Decorator) [打印本页]

作者: 金歌    时间: 2023-8-8 02:55
标题: quarkus依赖注入之八:装饰器(Decorator)
欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览



实战功能说明


编码实战

  1. package com.bolingcavalry.decorator;
  2. public interface Coffee {
  3.     /**
  4.      * 咖啡名称
  5.      * @return
  6.      */
  7.     String name();
  8.     /**
  9.      * 当前咖啡的价格
  10.      * @return
  11.      */
  12.     int getPrice();
  13. }
复制代码
  1. package com.bolingcavalry.decorator.impl;
  2. import com.bolingcavalry.decorator.Coffee;
  3. import javax.enterprise.context.ApplicationScoped;
  4. /**
  5. * 意式浓缩咖啡,价格3美元
  6. */
  7. @ApplicationScoped
  8. public class Espresso implements Coffee {
  9.     @Override
  10.     public String name() {
  11.         return "Espresso";
  12.     }
  13.     @Override
  14.     public int getPrice() {
  15.         return 3;
  16.     }
  17. }
复制代码
  1. package com.bolingcavalry.decorator.impl;
  2. import com.bolingcavalry.decorator.Coffee;
  3. import io.quarkus.arc.Priority;
  4. import io.quarkus.logging.Log;
  5. import javax.decorator.Decorator;
  6. import javax.decorator.Delegate;
  7. import javax.inject.Inject;
  8. @Decorator
  9. @Priority(11)
  10. public class Latte implements Coffee {
  11.     /**
  12.      * 牛奶价格:2美元
  13.      */
  14.     private static final int MILK_PRICE = 2;
  15.     @Delegate
  16.     @Inject
  17.     Coffee delegate;
  18.     @Override
  19.     public String name() {
  20.         return "Latte";
  21.     }
  22.     @Override
  23.     public int getPrice() {
  24.         // 将Latte的代理类打印出来,看quarkus注入的是否正确
  25.         Log.info("Latte's delegate type : " + this.delegate.name());
  26.         return delegate.getPrice() + MILK_PRICE;
  27.     }
  28. }
复制代码

  1. package com.bolingcavalry.decorator.impl;
  2. import com.bolingcavalry.decorator.Coffee;
  3. import io.quarkus.arc.Priority;
  4. import io.quarkus.logging.Log;
  5. import javax.decorator.Decorator;
  6. import javax.decorator.Delegate;
  7. import javax.inject.Inject;
  8. /**
  9. * 焦糖玛奇朵:拿铁+焦糖
  10. */
  11. @Decorator
  12. @Priority(10)
  13. public class CaramelMacchiato implements Coffee {
  14.     /**
  15.      * 焦糖价格:1美元
  16.      */
  17.     private static final int CARAMEL_PRICE = 1;
  18.     @Delegate
  19.     @Inject
  20.     Coffee delegate;
  21.     @Override
  22.     public String name() {
  23.         return "CaramelMacchiato";
  24.     }
  25.     @Override
  26.     public int getPrice() {
  27.         // 将CaramelMacchiato的代理类打印出来,看quarkus注入的是否正确
  28.         Log.infov("CaramelMacchiato's delegate type : " + this.delegate.name());
  29.         return delegate.getPrice() + CARAMEL_PRICE;
  30.     }
  31. }
复制代码
  1. @Delegate
  2. @Inject
  3. Coffee delegate;
复制代码
重要知识点

单元测试类

  1. package com.bolingcavalry;
  2. import com.bolingcavalry.decorator.Coffee;
  3. import io.quarkus.test.junit.QuarkusTest;
  4. import org.junit.jupiter.api.Assertions;
  5. import org.junit.jupiter.api.Test;
  6. import javax.inject.Inject;
  7. @QuarkusTest
  8. public class DecoratorTest {
  9.     @Inject
  10.     Coffee coffee;
  11.     @Test
  12.     public void testDecoratorPrice() {
  13.         Assertions.assertEquals(6, coffee.getPrice());
  14.     }
  15. }
复制代码
验证



与拦截器的不同


欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4