折扣计算策略--设计模式应用

设计模式中策略模式结合装饰模式的一个应用案例。

package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;

public abstract class AbstractDiscountStrategy {
	/**
	 * 单价
	 */
	protected BigDecimal price;
	/**
	 * 数量
	 */
	protected int copies;

	protected AbstractDiscountStrategy() {
	}

	/**
	 * @param price 单价
	 * @param copies 数量
	 */
	public AbstractDiscountStrategy(BigDecimal price, int copies) {
		this.price = price;
		this.copies = copies;
	}

	/**
	 * 计算折扣额度
	 * 
	 * @return 
	 */
	public abstract BigDecimal calculateDiscount();
}
package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;
/**
 * 零折扣策略
 * @author  Tang
 *
 */
public class NoDiscountStrategy extends AbstractDiscountStrategy {

	@Override
	public BigDecimal calculateDiscount() {
		return new BigDecimal(0);
	}

}
package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;
/**
 * 折扣率策略
 * @author  Tang
 *
 */
public class PercentageDiscountStrategy extends AbstractDiscountStrategy {
	/**
	 * 单位折扣率
	 */
	private BigDecimal percent;
	
	/**
	 * 
	 * @param price 单价
	 * @param copies 数量
	 * @param percent 单位折扣率
	 */
	public PercentageDiscountStrategy(BigDecimal price, int copies, BigDecimal percent) {
		super(price, copies);
		this.percent = percent;
	}

	@Override
	/**
	 * 总折扣额 = 单价 * 数量 * 单位折扣率
	 * 
	 */
	public BigDecimal calculateDiscount() {
		return price.multiply(new BigDecimal(copies)).multiply(this.percent);
	}

}
package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;

/**
 * 单位固定折扣额策略
 * @author  Tang
 *
 */
public class FlatRateDiscountStrategy extends AbstractDiscountStrategy {
	/**
	 * 单位折扣额
	 */
	private BigDecimal discount;
	
	/**
	 * 
	 * @param price 单价
	 * @param copies 数量
	 * @param discount 单位折扣额
	 */
	public FlatRateDiscountStrategy(int copies, BigDecimal discount) {
		super.copies = copies;
		this.discount = discount;
	}
	
	@Override
	/**
	 * 总折扣额 = 数量 * 单位折扣额
	 */
	public BigDecimal calculateDiscount() {
		return new BigDecimal(copies).multiply(this.discount);
	}

}
package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;
/**
 * 限制折扣额策略
 * @author  Tang
 *
 */
public class RestrictedDiscountStrategy extends AbstractDiscountStrategy {
	/**
	 * 折扣额度上限
	 */
	private BigDecimal limit;
	private AbstractDiscountStrategy strategy;
	
	/**
	 * 
	 * @param strategy 宿主策略
	 * @param limit 折扣限制额度
	 */
	public RestrictedDiscountStrategy(AbstractDiscountStrategy strategy, BigDecimal limit) {
		this.limit = limit;
		this.strategy = strategy;
	}

	@Override
	/**
	 * 当折扣额超过折扣限制额度时,总折扣额变为限制折扣额
	 */
	public BigDecimal calculateDiscount() {
		BigDecimal preDiscount = this.strategy.calculateDiscount();
		if (this.limit.doubleValue() > 0 && preDiscount.compareTo(this.limit) > 0) {
			return this.limit;
		}
		return preDiscount;
	}

}
package org.tang.zjnumall.strategy.discount;

import java.math.BigDecimal;

public class DiscountCalculator {
	/**
	 * 折扣策略
	 */
	private AbstractDiscountStrategy strategy;
	
	public DiscountCalculator(){}
	
	/**
	 * 
	 * @param strategy 具体折扣策略
	 */
	public DiscountCalculator(AbstractDiscountStrategy strategy){
		this.strategy = strategy;
	}
	
	
	public AbstractDiscountStrategy getStrategy() {
		return strategy;
	}

	public void setStrategy(AbstractDiscountStrategy strategy) {
		this.strategy = strategy;
	}

	public BigDecimal calculate(){
		return null;
	}
	
	public static void main(String[] args){
		BigDecimal price = new BigDecimal("99.99");
		int copies = 9;
		BigDecimal percent = new BigDecimal("0.12");
		BigDecimal discount = new BigDecimal("10");
		BigDecimal limit = new BigDecimal("100");
		
		AbstractDiscountStrategy noDiscount = new NoDiscountStrategy();
		AbstractDiscountStrategy percentStrategy = new PercentageDiscountStrategy(price, copies, percent);
		AbstractDiscountStrategy flatRateStrategy = new FlatRateDiscountStrategy(copies, discount);
		AbstractDiscountStrategy restrictedStrategy = new RestrictedDiscountStrategy(percentStrategy, limit);
		
		System.out.println("折扣前总额:"+price.multiply(new BigDecimal(copies)));
		System.out.println("零折扣策略总折扣额:"+noDiscount.calculateDiscount());
		System.out.println("折扣率策略总折扣额:"+percentStrategy.calculateDiscount());
		System.out.println("固定折扣额策略总折扣额:"+flatRateStrategy.calculateDiscount());
		System.out.println("限制折扣额策略总折扣额:"+restrictedStrategy.calculateDiscount());
	}
	
}

转载于:https://my.oschina.net/tangtianyun/blog/84049

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值