java策略模式

匿名 (未验证) 提交于 2019-12-02 21:40:30
版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/weixin_43835717/article/details/91491140

如果都使用if-else的话,就会使用代码变的臃肿,而且难以复用。那我们就可以根据不同的情况,将不同的方式封装成不同的策略,将策略与它的使用对象分离开来。

案例:

  • 定义注解,标注范围
/**  * @author Gjing  * 价格范围注解  **/ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface PriceRegion {     int min() default 0;     int max() default Integer.MAX_VALUE; } 
  • 具体策略
/**  * @author Gjing  * 抽象策略  **/ public interface Price {     BigDecimal getPrice(BigDecimal price); }  /**  * @author Gjing  * 会员,六折  **/ @PriceRegion(min = 10000,max = 20000) class Member implements Price {     @Override     public BigDecimal getPrice(BigDecimal price) {         return price.multiply(new BigDecimal(0.6 + ""));     } }  /**  * @author Gjing  * 普通客户  **/ @PriceRegion(max = 10000) class Ordinary implements Price {     @Override     public BigDecimal getPrice(BigDecimal price) {         return price;     } }  /**  * @author Gjing  * 超级会员,4折  **/  @PriceRegion(min = 20000) class SuperMember implements Price{     @Override     public BigDecimal getPrice(BigDecimal price) {         return price.multiply(new BigDecimal(0.4+""));     } } 
  • 策略上下文和策略工厂
/**  * @author Gjing  * 上下文  **/ class PriceContext {      BigDecimal getPrice(BigDecimal costPrice) throws Exception {         Price price = PriceFactory.getInstance().getPrice(costPrice);         return price.getPrice(costPrice);     } } /**  * @author Gjing  * 策略工厂  **/ class PriceFactory {      private static final PriceFactory FACTORY = new PriceFactory();     /**      * 策略类集合      */     private List<Class<? extends Price>> priceList = new ArrayList<>();       private PriceFactory() {         //这边是可以改造成自动获取文件路径的哈         priceList.add(Member.class);         priceList.add(Ordinary.class);         priceList.add(SuperMember.class);     }      /**      * 获取对应金额的策略类      * @param price 金额      * @return Price      * @throws Exception classNotFound      */     Price getPrice(BigDecimal price) throws Exception{         for (Class<? extends Price> clazz : priceList) {             PriceRegion priceRegion = clazz.getAnnotation(PriceRegion.class);             if (price.compareTo(new BigDecimal(priceRegion.max())) < 0 && price.compareTo(new BigDecimal(priceRegion.min())) > 0) {                 return clazz.newInstance();             }         }         return null;     }          static PriceFactory getInstance() {         return FACTORY;     } } 
  • 调用:
/**  * @author Gjing  **/ public class Test {     public static void main(String[] args) throws Exception {         PriceContext priceContext = new PriceContext();         System.out.println(priceContext.getPrice(new BigDecimal(200)));         System.out.println(priceContext.getPrice(new BigDecimal(11100)));         System.out.println(priceContext.getPrice(new BigDecimal(30000)));     } } 

以上为个人见解,如有误欢迎各位指正

文章来源: https://blog.csdn.net/weixin_43835717/article/details/91491140
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!