折扣计算,策略模式和装饰模式的具体应用。
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 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 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 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());
}
}
分享到:
相关推荐
java实验: 设计模式(单子、工厂、策略、组合、观察者模式)练习 在上次作业基础上,设计一个贩卖各类书籍的电子商务网站的购物车系统。该系统包括 的模块有: 模块1:图书目录的添加模块,实现对书本信息的增加。 ...
3.J2EE 只是适合企业计算应用的框架软件,但是 GoF 的设计模式几乎可以用于任何应用!因此 GoF 的设计模式应该是 J2EE 的重要理论基础之一。 所以说,GoF 的设计模式是 Java 基础知识和 J2EE 框架知识之间一座隐性...
包括计算税收(常规和按项目)以及对不同类型的策略应用折扣。 CustomerDiscounts.txt 此txt为VIP客户提供折扣 Day,Discount_Amount =>每行格式,这意味着将在DAY对VIP客户应用DISCOUNT_AMOUNT%的折扣。 客户.txt...
实例064 策略模式的简单应用 98 实例065 适配器模式的简单应用 100 实例066 普通内部类的简单应用 102 实例067 局部内部类的简单应用 103 实例068 匿名内部类的简单应用 104 实例069 静态内部类的简单应用 105 实例...
实例117 策略模式的简单应用 148 实例118 适配器模式的简单应用 149 实例119 普通内部类的简单应用 151 实例120 局部内部类的简单应用 152 实例121 匿名内部类的简单应用 153 实例122 静态内部类的简单应用 154 第2...
能为使用者提供各种有利的营销手段,实现网站经营者的营销策略,加强促销手段方式、会员等级折扣、虚拟货币、预付款、组合商品、套餐商品、点卡商品、赠品、定单的管理设置,实现访客下单等功能。最终为经营者带来...
4.强大的账单打印功能:支持账单的自设计,根据客户的多样需求自设计出符合客户自身的账单格式。 5.支持多种付款方式:如现金、刷卡等,用户还可根据需要增加设置其它的付款方式。 6.支持部分挂账:通常是对会员或...
4.强大的账单打印功能:支持账单的自设计,根据客户的多样需求自设计出符合客户自身的账单格式。 5.支持多种付款方式:如现金、刷卡等,用户还可根据需要增加设置其它的付款方式。 6.支持部分挂账:通常是对会员或...
独立WAP网站模式 无线应用协议(wireless application protocol,WAP)向移动终端提供互联网内容和先进增值服务的协议标准,是简化了的无 线互联网协议。WAP将互联网和移动电话技术结合起来,使使用移动终端设备(如...
独立WAP网站模式 无线应用协议(wireless application protocol,WAP)向移动终端提供互联网内容和先进增值服务的协议标准,是简化了的无 线互联网协议。WAP将互联网和移动电话技术结合起来,使使用移动终端设备(如...
综上所述,“认我测”在线认证检测系统,率先填补了认证检测领域移动端的空缺,提供了Web浏览器+移动端的双端访问模式,给用户提供了多种访问途径,真正实现了用户和检测机构的随时随地在线下单检测。 关键词:...
经过试验这种控制策略应用在小四轴效果不太理想,因此我们通常采用的串级PID控制小四轴,即引入了角速度环,通常内环使用PD(对象角速度)外环使用PI(对象角度&内环输出)这样的控制策略在测试中效果较好,但理想的...
计划工作流程规则的方案:30% 以上折扣通知 142 计划工作流程规则的方案:大量已打开的服务请求通知 143 定义工作流程规则的测试和迁移策略 144 关于创建工作流程规则 144 关于“工作流程规则”视图 144 定义工作...