java策略_java策略模式

如果都使用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> 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)));

}

}

以上为个人见解,如有误欢迎大家指正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值