以商场会员打折为例
打折的订单
package study.strategy.myStrategy.entity;
import java.math.BigDecimal;
import study.strategy.myStrategy.DiscountType;
/**
* 待结算的订单
* @author an
*
*/
public class Order {
/**
* 待结算的金额
*/
private BigDecimal sum;
/**
* 订单编码
*/
private String accountNo;
public BigDecimal getSum() {
return sum;
}
public void setSum(BigDecimal sum) {
this.sum = sum;
}
public String getAccountNo() {
return accountNo;
}
public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}
/**
* 订单打折方法
* @param discountType
* @return
*/
public DiscountResult getDiscountResult(DiscountType discountType){
return discountType.getDiscountedWay().discountAction(this);
}
}
打折之后的结果
package study.strategy.myStrategy.entity;
import java.math.BigDecimal;
/**
* 返回的打折结果
* @author an
*
*/
public class DiscountResult {
/**
* 订单编号
*/
private String accountNo;
/**
* 原价
*/
private BigDecimal sum;
/**
* 打折之后的价格
*/
private BigDecimal accountSum;
public String getAccountNo() {
return accountNo;
}
public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}
public BigDecimal getSum() {
return sum;
}
public void setSum(BigDecimal sum) {
this.sum = sum;
}
public BigDecimal getAccountSum() {
return accountSum;
}
public void setAccountSum(BigDecimal accountSum) {
this.accountSum = accountSum;
}
@Override
public String toString() {
return "原价是:" + sum + ", 折后价是:" + accountSum;
}
}
打折的接口方法
package study.strategy.myStrategy;
import study.strategy.myStrategy.entity.DiscountResult;
import study.strategy.myStrategy.entity.Order;
/**
* 打折方式
* @author an
*
*/
public interface DiscountedWay {
DiscountResult discountAction(Order order);
}
会员的打折方式
package study.strategy.myStrategy;
import java.math.BigDecimal;
import study.strategy.myStrategy.entity.DiscountResult;
import study.strategy.myStrategy.entity.Order;
/**
* 会员的打折方式
* @author an
*
*/
public class MemberDiscountWay implements DiscountedWay {
private static final BigDecimal M_RATE = new BigDecimal(0.7);
@Override
public DiscountResult discountAction(Order order) {
DiscountResult dis = new DiscountResult();
dis.setAccountNo(order.getAccountNo());
dis.setSum(order.getSum());
dis.setAccountSum(order.getSum().multiply(M_RATE));
return dis;
}
}
非会员的打折方式
package study.strategy.myStrategy;
import java.math.BigDecimal;
import study.strategy.myStrategy.entity.DiscountResult;
import study.strategy.myStrategy.entity.Order;
/**
* 非会员打折方式
* @author an
*
*/
public class UNMemberDiscountWay implements DiscountedWay {
private static final BigDecimal UNM_RATE = new BigDecimal(0.8);
@Override
public DiscountResult discountAction(Order order) {
DiscountResult dis = new DiscountResult();
dis.setAccountNo(order.getAccountNo());
dis.setSum(order.getSum());
dis.setAccountSum(order.getSum().multiply(UNM_RATE));
return dis;
}
}
枚举类工具
package study.strategy.myStrategy;
public enum DiscountType {
MEMBER(new MemberDiscountWay()),
UNMEMBER(new UNMemberDiscountWay());
private DiscountedWay discountedWay;
DiscountType(DiscountedWay discountedWay){
this.discountedWay = discountedWay;
}
public DiscountedWay getDiscountedWay(){
return discountedWay;
}
}
测试方法
package study.strategy.myStrategy;
import java.math.BigDecimal;
import study.strategy.myStrategy.entity.DiscountResult;
import study.strategy.myStrategy.entity.Order;
public class StrategyTest {
public static void main(String[] args) {
Order order = new Order();
order.setAccountNo("NO000001");
order.setSum(new BigDecimal(100));
DiscountResult way =order.getDiscountResult(DiscountType.MEMBER);
System.out.println(way);
way =order.getDiscountResult(DiscountType.UNMEMBER);
System.out.println(way);
}
}
运行结果
原价是:100, 折后价是:69.9999999999999955591079014993738383054733276367187500
原价是:100, 折后价是:80.0000000000000044408920985006261616945266723632812500