package com.itranswarp.learnjava;
import java.math.BigDecimal;
public interface DiscountStrategy {
BigDecimal getDiscount(BigDecimal total);
}
package com.itranswarp.learnjava;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class UserDiscountStrategy implements DiscountStrategy {
@Override
public BigDecimal getDiscount(BigDecimal total) {
// 普通会员打九折:
return total.multiply(new BigDecimal("0.1")).setScale(2, RoundingMode.DOWN);
}
}
package com.itranswarp.learnjava;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class PrimeDiscountStrategy implements DiscountStrategy {
@Override
public BigDecimal getDiscount(BigDecimal total) {
// Prime会员打七折:
return total.multiply(new BigDecimal("0.3")).setScale(2, RoundingMode.DOWN);
}
}
package com.itranswarp.learnjava;
import java.math.BigDecimal;
public class OverDiscountStrategy implements DiscountStrategy {
@Override
public BigDecimal getDiscount(BigDecimal total) {
// 满100减20优惠:
return total.compareTo(BigDecimal.valueOf(100)) >= 0 ? BigDecimal.valueOf(20) : BigDecimal.ZERO;
}
}
package com.itranswarp.learnjava;
import java.math.BigDecimal;
public class DiscountContext {
private DiscountStrategy strategy = new UserDiscountStrategy();
public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public BigDecimal calculatePrice(BigDecimal total) {
return total.subtract(this.strategy.getDiscount(total)).setScale(2);
}
}
package com.itranswarp.learnjava;
import java.math.BigDecimal;
/**
* Learn Java from https://www.liaoxuefeng.com/
*
* @author liaoxuefeng
*/
public class Main {
public static void main(String[] args) {
DiscountContext ctx = new DiscountContext();
// 默认使用普通会员折扣:
BigDecimal pay1 = ctx.calculatePrice(BigDecimal.valueOf(105));
System.out.println(pay1);
// 使用满减折扣:
ctx.setStrategy(new OverDiscountStrategy());
BigDecimal pay2 = ctx.calculatePrice(BigDecimal.valueOf(105));
System.out.println(pay2);
// 使用Prime会员折扣:
ctx.setStrategy(new PrimeDiscountStrategy());
BigDecimal pay3 = ctx.calculatePrice(BigDecimal.valueOf(105));
System.out.println(pay3);
}
}